[Bug c++/80259] [5/6/7 Regression] ICE deleting friend function
jakub at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Mar 30 08:08:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80259
--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
duplicate_decls is called with the DECL_INITIAL is still being NULL on the
newdecl (and olddecl has it a BLOCK).
#0 duplicate_decls (newdecl=<function_decl 0x7fffefc4a100 foo>,
olddecl=<function_decl 0x7fffefc4a000 foo>, newdecl_is_friend=true)
at ../../gcc/cp/decl.c:1401
#1 0x0000000000a2420c in pushdecl_maybe_friend_1 (x=<function_decl
0x7fffefc4a100 foo>, is_friend=true) at ../../gcc/cp/name-lookup.c:835
#2 0x0000000000a27940 in pushdecl_maybe_friend (x=<function_decl
0x7fffefc4a100 foo>, is_friend=true) at ../../gcc/cp/name-lookup.c:1352
#3 0x0000000000a2aaff in pushdecl_with_scope_1 (x=<function_decl
0x7fffefc4a100 foo>, level=0x7fffefade000, is_friend=true)
at ../../gcc/cp/name-lookup.c:2349
#4 0x0000000000a2aba2 in pushdecl_with_scope (x=<function_decl 0x7fffefc4a100
foo>, level=0x7fffefade000, is_friend=true)
at ../../gcc/cp/name-lookup.c:2363
#5 0x0000000000a30b81 in pushdecl_namespace_level (x=<function_decl
0x7fffefc4a100 foo>, is_friend=true) at ../../gcc/cp/name-lookup.c:3978
#6 0x000000000097cf07 in do_friend (ctype=<tree 0x0>,
declarator=<identifier_node 0x7fffefc498a0 foo>, decl=<function_decl
0x7fffefc4a100 foo>,
attrlist=<tree 0x0>, flags=NO_SPECIAL, funcdef_flag=false) at
../../gcc/cp/friend.c:640
#7 0x00000000007c9f6a in grokdeclarator (declarator=0x2ad2a00,
declspecs=0x7fffffffd830, decl_context=FIELD, initialized=1,
attrlist=0x7fffffffd770) at ../../gcc/cp/decl.c:12060
#8 0x00000000008b879f in grokfield (declarator=0x2ad2a60,
declspecs=0x7fffffffd830, init=<identifier_node 0x7fffefad72a0 delete>,
init_const_expr_p=true, asmspec_tree=<tree 0x0>, attrlist=<tree 0x0>) at
../../gcc/cp/decl2.c:806
And only afterwards grokfield reaches:
889 if (init == ridpointers[(int)RID_DELETE])
890 {
891 DECL_DELETED_FN (value) = 1;
892 DECL_DECLARED_INLINE_P (value) = 1;
893 DECL_INITIAL (value) = error_mark_node;
894 }
At this point I think we can't call redeclaration_error_message, because we
don't have the new decl anymore, only the merged (old one). Perhaps custom
error message here if value is a friend and it has non-NULL (or non-NULL and
non-error_mark_node?) DECL_INITIAL and use there location_t for the new decl
from declarator->id_loc (that would be the foo) or input_location (that would
be the deleted) or something similar?
More information about the Gcc-bugs
mailing list