As prophesied in GCC 8.1, it's time to kill friend injection.
Committing to trunk. nathan -- Nathan Sidwell
2018-05-03 Nathan Sidwell <nat...@acm.org> * doc/extend.texi (Deprecated Features): Remove -ffriend-injection. (Backwards Compatibility): Likewise. * doc/invoke.texi (C++ Language Options): Likewise. (C++ Dialect Options): Likewise. c-family/ * c.opt (ffriend-injection): Remove functionality, issue warning. cp/ * decl.c (cxx_init_decl_processing): Remove flag_friend_injection. * name-lookup.c (do_pushdecl): Likewise. testsuite/ Remove -ffriend-injection. * g++.old-deja/g++.jason/scoping15.C: Delete. * g++.old-deja/g++.mike/net43.C: Delete. Index: c-family/c.opt =================================================================== --- c-family/c.opt (revision 259900) +++ c-family/c.opt (working copy) @@ -1494,8 +1494,7 @@ C++ ObjC++ Var(flag_new_inheriting_ctors Implement C++17 inheriting constructor semantics. ffriend-injection -C++ ObjC++ Var(flag_friend_injection) -Inject friend functions into enclosing namespace. +C++ ObjC++ Ignore Warn(switch %qs is no longer supported) fkeep-inline-dllexport C C++ ObjC ObjC++ Var(flag_keep_inline_dllexport) Init(1) Report Condition(TARGET_DLLIMPORT_DECL_ATTRIBUTES) Index: cp/decl.c =================================================================== --- cp/decl.c (revision 259900) +++ cp/decl.c (working copy) @@ -4175,9 +4175,6 @@ cxx_init_decl_processing (void) if (!flag_new_for_scope) warning_at (UNKNOWN_LOCATION, OPT_Wdeprecated, "%<-fno-for-scope%> is deprecated"); - if (flag_friend_injection) - warning_at (UNKNOWN_LOCATION, OPT_Wdeprecated, - "%<-ffriend-injection%> is deprecated"); c_common_nodes_and_builtins (); Index: cp/name-lookup.c =================================================================== --- cp/name-lookup.c (revision 259900) +++ cp/name-lookup.c (working copy) @@ -3055,7 +3055,6 @@ do_pushdecl (tree decl, bool is_friend) old = OVL_CHAIN (old); check_template_shadow (decl); - bool visible_injection = false; if (DECL_DECLARES_FUNCTION_P (decl)) { @@ -3073,11 +3072,8 @@ do_pushdecl (tree decl, bool is_friend) /* Don't attempt to push it. */ return error_mark_node; } - if (!flag_friend_injection) - /* Hide it from ordinary lookup. */ - DECL_ANTICIPATED (decl) = DECL_HIDDEN_FRIEND_P (decl) = true; - else - visible_injection = true; + /* Hide it from ordinary lookup. */ + DECL_ANTICIPATED (decl) = DECL_HIDDEN_FRIEND_P (decl) = true; } } @@ -3129,9 +3125,6 @@ do_pushdecl (tree decl, bool is_friend) } else if (VAR_P (decl)) maybe_register_incomplete_var (decl); - else if (visible_injection) - warning (0, "injected friend %qD is visible" - " due to %<-ffriend-injection%>", decl); if ((VAR_P (decl) || TREE_CODE (decl) == FUNCTION_DECL) && DECL_EXTERN_C_P (decl)) Index: doc/extend.texi =================================================================== --- doc/extend.texi (revision 259900) +++ doc/extend.texi (working copy) @@ -23846,8 +23846,7 @@ that are now deprecated or have been rem @table @code @item -fno-for-scope -@itemx -ffriend-injection -These two options provide compatibility with pre-standard C++. +This option provides compatibility with pre-standard C++. @xref{Backwards Compatibility}. @end table @@ -23907,11 +23906,6 @@ The behavior is deprecated, only availab @option{-fpermissive} option to enable it. The behavior will be removed. -@item Friend Injection -The @option{-ffriend-injection} option makes injected friends visible -to regular name lookup, unlike standard C++. This option is -deprecated and will be removed. - @item Implicit C language Old C system header files did not contain an @code{extern "C" @{@dots{}@}} scope to set the language. On such systems, all header files are Index: doc/invoke.texi =================================================================== --- doc/invoke.texi (revision 259900) +++ doc/invoke.texi (working copy) @@ -193,7 +193,6 @@ in the following sections. @gccoptlist{-fabi-version=@var{n} -fno-access-control @gol -faligned-new=@var{n} -fargs-in-order=@var{n} -fcheck-new @gol -fconstexpr-depth=@var{n} -fconstexpr-loop-limit=@var{n} @gol --ffriend-injection @gol -fno-elide-constructors @gol -fno-enforce-eh-specs @gol -ffor-scope -fno-for-scope -fno-gnu-keywords @gol @@ -2448,18 +2447,6 @@ originally proposed semantics for the C+ of the final standard, so it is disabled by default. This option is deprecated, and may be removed in a future version of G++. -@item -ffriend-injection -@opindex ffriend-injection -Inject friend functions into the enclosing namespace, so that they are -visible outside the scope of the class in which they are declared. -Friend functions were documented to work this way in the old Annotated -C++ Reference Manual. -However, in ISO C++ a friend function that is not declared -in an enclosing scope can only be found using argument dependent -lookup. GCC defaults to the standard behavior. - -This option is deprecated and will be removed. - @item -fno-elide-constructors @opindex fno-elide-constructors The C++ standard allows an implementation to omit creating a temporary Index: testsuite/g++.old-deja/g++.jason/scoping15.C =================================================================== --- testsuite/g++.old-deja/g++.jason/scoping15.C (revision 259900) +++ testsuite/g++.old-deja/g++.jason/scoping15.C (working copy) @@ -1,25 +0,0 @@ -// { dg-do assemble } -// { dg-options "-ffriend-injection" } -// Bug: g++ ignores the :: qualification and dies trying to treat an integer -// variable as a list of functions. - -class DComplex; -double imag (const DComplex&); - -class DComplex { -public: - friend double imag(const DComplex& a); // Not injected, no warning -}; - -class FComplex { -public: - friend float imag(const FComplex& a); // { dg-warning "is visible" } -}; - -void -scnrm2(FComplex cx[]) -{ - int imag; - ::imag( cx[0] ); -} -// { dg-warning "ffriend-injection.* is deprecated" "cc1plus:" { target *-*-* } 0 } Index: testsuite/g++.old-deja/g++.mike/net43.C =================================================================== --- testsuite/g++.old-deja/g++.mike/net43.C (revision 259900) +++ testsuite/g++.old-deja/g++.mike/net43.C (working copy) @@ -1,12 +0,0 @@ -// { dg-do assemble } -// { dg-options "-ffriend-injection -Wno-deprecated" } - -class foo { - public: - friend int operator ^(const foo&, const foo&); // { dg-message "is visible" } -}; - -int main () -{ - int (*funptr) (const foo &, const foo &) = operator ^; -}