On 05/12/2016 06:34 PM, Martin Sebor wrote:
Attached is a resubmission of the patch for c++/60760 originally
submitted late in the 6.0 cycle along with a patch for c++/67376.
Since c++/60760 was not a regression, it was decided that it
would be safer to defer the fix until after the 6.1.0 release.
While retesting this patch I was happy to notice that it also
fixes another bug: c++/71091 - constexpr reference bound to a null
pointer dereference accepted.
I'm not sure why we need to track nullptr_p through everything. Can't
we set *non_constant_p instead in the places where it's problematic, as
in cxx_eval_binary_expression?
I understand that the complication comes because of needing to allow
constexpr int *p = &*(int*)0;
but I don't see how cxx_eval_component_reference could come up with a
constant value for the referent of a null pointer, so we already reject
struct A { int i; };
constexpr A* p = nullptr;
constexpr int i = p->i;
In cxx_eval_indirect_ref, we could check !lval and reject the
constant-expression at that point.
Jason