On Thu, Feb 4, 2016 at 12:24 PM, Patrick Palka <patr...@parcs.ath.cx> wrote: > On Thu, Feb 4, 2016 at 11:57 AM, Jason Merrill <ja...@redhat.com> wrote: >> On 02/04/2016 10:32 AM, Patrick Palka wrote: >>> >>> 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. >> >> >> Right, because they might be defined as aliases elsewhere. But it looks >> like it should work if you define f and g. > > That makes sense. But even when I define f and g, the comparisons > don't get folded away: > > #define SA(x) static_assert ((x), #x) > > void f () { } > void g () { } > > struct X { int a, b; void f (); void g (); }; > > void X::f () { } > void X::g () { } > > void > foo () > { > SA (&f != &g); > SA (&X::f != &X::g); > } > > bool bar = &f != &g; > > Although the static_asserts fail, the initialization of the variable > bar _does_ get folded to 1 during gimplification. When evaluating the > static_asserts, symtab_node::equal_address_to again returns -1 but > during gimplification the same call to symtab_node::equal_address_to > returns 0. So probably the symbols are not fully defined yet in the > symbol table at the point when we are evaluating the static_asserts.
Indeed, symtab_node::equal_address_to returns 0 only if both symbols have their ->analyzed flag set. But cgraph_node::analyze() (which sets the analyzed flag) is called during finalization of the compilation unit -- obviously not in time for the static_asserts to get folded.