https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69657
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Priority|P3 |P1
CC| |jakub at gcc dot gnu.org,
| |jason at gcc dot gnu.org
Target Milestone|--- |6.0
--- Comment #9 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
If there is in #c3 extern "C" int abs(int); before the using foo::abs;, it
works fine.
The problem is during do_toplevel_using_decl (and likely other spots in
name-lookup.c) - do_nonmember_using_decl throws away the DECL_ANTICIPATED
olddecls:
2586 /* It is impossible to overload a built-in function; any explicit
2587 declaration eliminates the built-in declaration. So, if OLDVAL
2588 is a built-in, then we can just pretend it isn't there. */
2589 if (oldval
2590 && TREE_CODE (oldval) == FUNCTION_DECL
2591 && DECL_ANTICIPATED (oldval)
2592 && !DECL_HIDDEN_FRIEND_P (oldval))
and do_toplevel_using_decl then overwrites the binding->value with an OVERLOAD
that doesn't contain the builtin.
Perhaps we should keep the cxx_binding with ->value of DECL_ANTICIPATED
FUNCTION_DECL around, but hide it with another binding if the new OVERLOAD or
value is not builtin, and then when pushing extern "C" decls look if we don't
have a DECL_ANTICIPATED decl in some earlier binding of the same scope, and if
yes, duplicate_decls that decl with the anticipated one or something similar.