This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
On 02/04/2016 12:24 PM, Patrick Palka wrote:
On Thu, Feb 4, 2016 at 11:57 AM, Jason Merrill <jason@redhat.com> wrote:On 02/04/2016 10:32 AM, Patrick Palka wrote:On Thu, Feb 4, 2016 at 9:24 AM, Jason Merrill <jason@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.
Aha. That seems wrong, but certainly not something to fix now. The patch is OK.
Jason
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |