[C++ PATCH] Deprecate -ffriend-injection
authorNathan Sidwell <nathan@acm.org>
Fri, 16 Feb 2018 16:21:36 +0000 (16:21 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Fri, 16 Feb 2018 16:21:36 +0000 (16:21 +0000)
https://gcc.gnu.org/ml/gcc-patches/2018-02/msg00998.html
Deprecate -ffriend-injection.
* decl.c (cxx_init_decl_processing): Emit warning on option.
* name-lookup.c (do_pushdecl): Emit warning if we push a visible
friend.

* doc/extend.texi (Backwards Compatibility): Mention friend
injection.  Note for-scope is deprecated.
* doc/invoke.texi (-ffriend-injection): Deprecate.

* g++.old-deja/g++.jason/scoping15.C: Expect warnings.
* g++.old-deja/g++.mike/net43.C: Likewise.

From-SVN: r257742

gcc/ChangeLog
gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/cp/name-lookup.c
gcc/doc/extend.texi
gcc/doc/invoke.texi
gcc/testsuite/ChangeLog
gcc/testsuite/g++.old-deja/g++.jason/scoping15.C
gcc/testsuite/g++.old-deja/g++.mike/net43.C

index 332a38f69fc802abf6c9a46f6a3743b2a5223e00..d3c06450004abb810d8b09db1847b517989680b8 100644 (file)
@@ -1,3 +1,9 @@
+2018-02-16  Nathan Sidwell  <nathan@acm.org>
+
+       * doc/extend.texi (Backwards Compatibility): Mention friend
+       injection.  Note for-scope is deprecated.
+       * doc/invoke.texi (-ffriend-injection): Deprecate.
+
 2018-02-16  Segher Boessenkool  <segher@kernel.crashing.org>
 
        * combine.c (try_combine): When adjusting LOG_LINKS for the destination
index 1da0a4d4a53d2d74ad417bb86175551091ab912d..ee08e689b4ea7e0d812e88d2b33ade0538507ae6 100644 (file)
@@ -1,3 +1,10 @@
+2018-02-16  Nathan Sidwell  <nathan@acm.org>
+
+       Deprecate -ffriend-injection.
+       * decl.c (cxx_init_decl_processing): Emit warning on option.
+       * name-lookup.c (do_pushdecl): Emit warning if we push a visible
+       friend.
+
 2018-02-16  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/82468
index fbcc778f0cc23c490b50a4c588306c39964b8060..15f7f1224627df4a51e118e63cdc38d591ddcea2 100644 (file)
@@ -4091,8 +4091,14 @@ cxx_init_decl_processing (void)
   pop_namespace ();
 
   flag_noexcept_type = (cxx_dialect >= cxx17);
+  /* There's no fixed location for <command-line>, the current
+     location is <builtins>, which is somewhat confusing.  */
   if (!flag_new_for_scope)
-    warning (OPT_Wdeprecated, "%<-fno-for-scope%> is deprecated");
+    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 47cee30338db2c6aaa77e71cda7907448978a62d..9117e0b30ebb46794317bce0b645cfce5795cce1 100644 (file)
@@ -3071,6 +3071,7 @@ 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))
        {
@@ -3091,6 +3092,8 @@ do_pushdecl (tree decl, bool is_friend)
              if (!flag_friend_injection)
                /* Hide it from ordinary lookup.  */
                DECL_ANTICIPATED (decl) = DECL_HIDDEN_FRIEND_P (decl) = true;
+             else
+               visible_injection = true;
            }
        }
 
@@ -3142,6 +3145,9 @@ 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 5c3c5ec2dc84413e65f416c6332ebf5dbbf91250..ee37eee4a5a56a783c463d3b84794f4fc7cdc771 100644 (file)
@@ -23881,11 +23881,23 @@ deprecated.   @xref{Deprecated Features}.
 
 @table @code
 @item For scope
-If a variable is declared at for scope, it used to remain in scope until
-the end of the scope that contained the for statement (rather than just
-within the for scope).  G++ retains this, but issues a warning, if such a
+If a variable is declared at for scope, it used to remain in scope
+until the end of the scope that contained the for statement (rather
+than just within the for scope).  The deprecated
+@option{-fno-for-scope} option enables this non-standard behaviour.
+Without the option, G++ retains this, but issues a warning, if such a
 variable is accessed outside the for scope.
 
+The behaviour is deprecated, only available with @option{-std=c++98}
+@option{-std=gnu++98} languages and you must use the
+@option{-fpermissive} option to enable it.  The behaviour 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 bcffc8c10986562440528786913886e66c4db476..277c99a0527b302fc8578b9ee9cbbf15f1a54b5b 100644 (file)
@@ -2451,8 +2451,7 @@ 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 for compatibility, and may be removed in a future
-release of G++.
+This option is deprecated and will be removed.
 
 @item -fno-elide-constructors
 @opindex fno-elide-constructors
index 068f169ed6d2cd1deda08b3ac3e8726058380a3f..0bed6c3f09db5cc7d604cde8ecab8e1aafc699bd 100644 (file)
@@ -1,3 +1,8 @@
+2018-02-16  Nathan Sidwell  <nathan@acm.org>
+
+       * g++.old-deja/g++.jason/scoping15.C: Expect warnings.
+       * g++.old-deja/g++.mike/net43.C: Likewise.
+
 2018-02-16  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/82468
index cc34c5f5785e2d768da1c936150223b7174774f9..69207e9334b22d1f87ddda9a04cd8d0022d3fdf0 100644 (file)
@@ -3,14 +3,17 @@
 // 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);
+  friend  double   imag(const DComplex& a); // Not injected, no warning
 };
 
 class FComplex {
 public:
-  friend  float    imag(const FComplex& a);
+  friend  float    imag(const FComplex& a); // { dg-warning "is visible"
 };
 
 void
@@ -19,3 +22,4 @@ scnrm2(FComplex cx[])
   int imag;
   ::imag( cx[0] );
 }
+// { dg-warning "ffriend-injection.* is deprecated" "" { target *-*-* } cc1plus: }
index aadd03de92f39c12a41a4361d7a68bac7b9e8f6d..de266de4a8768cd85021cf2a4503bde5722f96b6 100644 (file)
@@ -1,9 +1,9 @@
 // { dg-do assemble  }
-// { dg-options "-ffriend-injection" }
+// { dg-options "-ffriend-injection -Wno-deprecated" }
 
 class foo {
  public:
-   friend int operator ^(const foo&, const foo&);
+  friend int operator ^(const foo&, const foo&); // { dg-message "is visible" }
 };
 
 int main ()