diff mbox series

[C++] Kill -ffriend-injection

Message ID 5849adb3-b545-b3ef-ebb9-2c08ebbf9747@acm.org
State New
Headers show
Series [C++] Kill -ffriend-injection | expand

Commit Message

Nathan Sidwell May 3, 2018, 7:21 p.m. UTC
As prophesied in GCC 8.1, it's time to kill friend injection.

Committing to trunk.

nathan
diff mbox series

Patch

2018-05-03  Nathan Sidwell  <nathan@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 ^;
-}