On Thu, Feb 4, 2016 at 9:24 AM, Jason Merrill <ja...@redhat.com> wrote:
> On 02/03/2016 12:51 PM, Patrick Palka wrote:
>>
>> +           && (integer_minus_onep (lhs)
>> +           || integer_minus_onep (rhs)))
>
>
> Let's use null_member_pointer_value_p here.

Done.

>
> Please add pointers to member functions to the testcase.

This does not currently work properly because comparisons between
distinct pointers to (non-virtual) member functions eventually perform
a comparison between two distinct FUNCTION_DECLs, and fold_binary_loc
currently does not fold away such comparisons. So any static_asserts
that perform comparisons between distinct function pointers or between
distinct pointers to (non-virtual) member functions fail with
"non-constant condition for static assertion".  (Comparisons between
pointers to distinct virtual member functions _do_ work because in
that case we are ultimately just comparing integer offsets, not
FUNCTION_DECLs.  And comparisons between equivalent pointers trivially
work.)

I think the problem may lie in symtab_node::equal_address_to, which
apparently returns -1, instead of 0, for two obviously distinct
FUNCTION_DECLs.

Test case:

#define SA(x) static_assert ((x), #x)

void f ();
void g ();

struct X { void f (); void g (); };

void
foo ()
{
  SA (&f != &g);  // "non-constant expression"
  SA (&X::f != &X::g);  // "non-constant expression"
}

Reply via email to