G++ should not compile this: constexpr int* ptr = nullptr; constexpr int* ptr2 = ptr + 1;
Agreed. But it should still be possible to add the additive identity (The core language drafted to support this): constexpr int* ptr = nullptr; constexpr int x = 0; constexpr int* ptr2 = ptr + x;
Yes, we rely on that in initializer_list<>::end(), and clang rejects that. I discussed that case with Jason and we think [expr.add] could be clarified - do you have an existing issue number related to that?
(In reply to Jonathan Wakely from comment #2) > Yes, we rely on that in initializer_list<>::end(), and clang rejects that. <nod> > I discussed that case with Jason and we think [expr.add] could be clarified > - do you have an existing issue number related to that? I haven't - I myself found the existing wording always clear in that regard.
Reconfirming with today's trunk of 6.0. Bug 70151 is related.
I'm up to my ears in constexpr so I might as well try to fix this too.
Patch posted for review: https://gcc.gnu.org/ml/gcc-patches/2016-03/msg00796.html
This part of the patch wasn't accepted for 6.1.0. I'll resubmit it for 7.0.
Patch resubmitted for review: https://gcc.gnu.org/ml/gcc-patches/2016-05/msg00935.html
Author: msebor Date: Sat Jul 30 22:36:56 2016 New Revision: 238909 URL: https://gcc.gnu.org/viewcvs?rev=238909&root=gcc&view=rev Log: PR c++/60760 - arithmetic on null pointers should not be allowed in constant PR c++/71091 - constexpr reference bound to a null pointer dereference gcc/cp/ChangeLog: PR c++/60760 PR c++/71091 * constexpr.c (cxx_eval_binary_expression): Reject invalid expressions involving null pointers. (cxx_eval_component_reference): Reject null pointer dereferences. (cxx_eval_indirect_ref): Reject indirecting through null pointers. (cxx_eval_constant_expression): Reject invalid expressions involving null pointers. gcc/testsuite/ChangeLog: PR c++/60760 PR c++/71091 * g++.dg/cpp0x/constexpr-cast.C: New test. * g++.dg/cpp0x/constexpr-nullptr-2.C: New test. * g++.dg/cpp1y/constexpr-sfinae.C: Correct. * g++.dg/ubsan/pr63956.C: Correct. Added: trunk/gcc/testsuite/g++.dg/cpp0x/constexpr-cast.C trunk/gcc/testsuite/g++.dg/cpp0x/constexpr-nullptr-2.C Modified: trunk/gcc/cp/ChangeLog trunk/gcc/cp/constexpr.c trunk/gcc/testsuite/ChangeLog trunk/gcc/testsuite/g++.dg/cpp1y/constexpr-sfinae.C trunk/gcc/testsuite/g++.dg/ubsan/pr63956.C
Fixed by r238909.