Deprecate some C++ extensions
authorNathan Sidwell <nathan@acm.org>
Wed, 21 Mar 2018 11:04:36 +0000 (11:04 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Wed, 21 Mar 2018 11:04:36 +0000 (11:04 +0000)
https://gcc.gnu.org/ml/gcc-patches/2018-03/msg00995.html
* doc/extend.texi (Deprecated Features): Update deprecared flags,
mention anon-struct/union members and trailing attributes.

cp/
* class.c (finish_struct_anon_r): Refactor, deprecate anything
other than public non-static data members.
* parser.c (cp_parser_init_declarator): Deprecate attributes after
parenthesized initializer.

testsuite/
* g++.dg/ext/anon-struct6.C: Adjust.
* g++.dg/ext/deprecate-1.C: New.
* g++.dg/ext/deprecate-2.C: New.
* g++.dg/lookup/pr84602.C: Adjust.
* g++.dg/lookup/pr84962.C: Adjust.
* g++.old-deja/g++.other/anon4.C

From-SVN: r258712

12 files changed:
gcc/ChangeLog
gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/parser.c
gcc/doc/extend.texi
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/anon-struct6.C
gcc/testsuite/g++.dg/ext/deprecate-1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/ext/deprecate-2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/lookup/pr84602.C
gcc/testsuite/g++.dg/lookup/pr84962.C
gcc/testsuite/g++.old-deja/g++.other/anon4.C

index 1f48794ee74c031a68770a8b884f8293e984f65b..d886c45f10d5ccbf7ba2e47c4b287a2fc9a14f50 100644 (file)
@@ -1,3 +1,8 @@
+2018-03-21  Nathan Sidwell  <nathan@acm.org>
+
+       * doc/extend.texi (Deprecated Features): Update deprecared flags,
+       mention anon-struct/union members and trailing attributes.
+
 2018-03-21  Bin Cheng  <bin.cheng@arm.com>
 
        PR tree-optimization/84969
index 5a37c8235bfe24b2910bdc1b2d68bbbe8c05cb6e..da19013d21cb5c0ce0ad9ce97f377b28c177699b 100644 (file)
@@ -1,5 +1,10 @@
 2018-03-21  Nathan Sidwell  <nathan@acm.org>
 
+       * class.c (finish_struct_anon_r): Refactor, deprecate anything
+       other than public non-static data members.
+       * parser.c (cp_parser_init_declarator): Deprecate attributes after
+       parenthesized initializer.
+
        PR c++/84836
        * name-lookup.c (update_binding): Correct logic for local binding
        update.
index 8348552a05b613762b2f385cf608d2372c8ac96c..3edae0f5e6193eced5df8bf7b75082d54086c960 100644 (file)
@@ -2869,9 +2869,7 @@ warn_hidden (tree t)
 static void
 finish_struct_anon_r (tree field, bool complain)
 {
-  bool is_union = TREE_CODE (TREE_TYPE (field)) == UNION_TYPE;
-  tree elt = TYPE_FIELDS (TREE_TYPE (field));
-  for (; elt; elt = DECL_CHAIN (elt))
+  for (tree elt = TYPE_FIELDS (TREE_TYPE (field)); elt; elt = DECL_CHAIN (elt))
     {
       /* We're generally only interested in entities the user
         declared, but we also find nested classes by noticing
@@ -2885,50 +2883,34 @@ finish_struct_anon_r (tree field, bool complain)
              || TYPE_UNNAMED_P (TREE_TYPE (elt))))
        continue;
 
-      if (TREE_CODE (elt) != FIELD_DECL)
+      if (complain
+         && (TREE_CODE (elt) != FIELD_DECL
+             || (TREE_PRIVATE (elt) || TREE_PROTECTED (elt))))
        {
          /* We already complained about static data members in
             finish_static_data_member_decl.  */
-         if (complain && !VAR_P (elt))
+         if (!VAR_P (elt)
+             && permerror (DECL_SOURCE_LOCATION (elt),
+                           TREE_CODE (TREE_TYPE (field)) == UNION_TYPE
+                           ? "%q#D invalid; an anonymous union may "
+                           "only have public non-static data members"
+                           : "%q#D invalid; an anonymous struct may "
+                           "only have public non-static data members", elt))
            {
-             if (is_union)
-               permerror (DECL_SOURCE_LOCATION (elt),
-                          "%q#D invalid; an anonymous union can "
-                          "only have non-static data members", elt);
-             else
-               permerror (DECL_SOURCE_LOCATION (elt),
-                          "%q#D invalid; an anonymous struct can "
-                          "only have non-static data members", elt);
-           }
-         continue;
-       }
-
-      if (complain)
-       {
-         if (TREE_PRIVATE (elt))
-           {
-             if (is_union)
-               permerror (DECL_SOURCE_LOCATION (elt),
-                          "private member %q#D in anonymous union", elt);
-             else
-               permerror (DECL_SOURCE_LOCATION (elt),
-                          "private member %q#D in anonymous struct", elt);
-           }
-         else if (TREE_PROTECTED (elt))
-           {
-             if (is_union)
-               permerror (DECL_SOURCE_LOCATION (elt),
-                          "protected member %q#D in anonymous union", elt);
-             else
-               permerror (DECL_SOURCE_LOCATION (elt),
-                          "protected member %q#D in anonymous struct", elt);
+             static bool hint;
+             if (flag_permissive && !hint)
+               {
+                 hint = true;
+                 inform (DECL_SOURCE_LOCATION (elt),
+                         "this flexibility is deprecated and will be removed");
+               }
            }
        }
 
       TREE_PRIVATE (elt) = TREE_PRIVATE (field);
       TREE_PROTECTED (elt) = TREE_PROTECTED (field);
 
-      /* Recurse into the anonymous aggregates to handle correctly
+      /* Recurse into the anonymous aggregates to correctly handle
         access control (c++/24926):
 
         class A {
index c8a0e77aec6146c8f16fc8df66981ada7f241c9b..4e3e1dccda0effa112627460d5cd78384c7d96df 100644 (file)
@@ -19685,12 +19685,21 @@ cp_parser_init_declarator (cp_parser* parser,
   /* The old parser allows attributes to appear after a parenthesized
      initializer.  Mark Mitchell proposed removing this functionality
      on the GCC mailing lists on 2002-08-13.  This parser accepts the
-     attributes -- but ignores them.  */
+     attributes -- but ignores them.  Made a permerror in GCC 8.  */
   if (cp_parser_allow_gnu_extensions_p (parser)
-      && initialization_kind == CPP_OPEN_PAREN)
-    if (cp_parser_attributes_opt (parser))
-      warning (OPT_Wattributes,
-              "attributes after parenthesized initializer ignored");
+      && initialization_kind == CPP_OPEN_PAREN
+      && cp_parser_attributes_opt (parser)
+      && permerror (input_location,
+                   "attributes after parenthesized initializer ignored"))
+    {
+      static bool hint;
+      if (flag_permissive && !hint)
+       {
+         hint = true;
+         inform (input_location,
+                 "this flexibility is deprecated and will be removed");
+       }
+    }
 
   /* And now complain about a non-function implicit template.  */
   if (bogus_implicit_tmpl && decl != error_mark_node)
index c0e779253cd9bbaa80a41ef494d431b44e224093..ce7862dbe6da18362ff6dedd9bc250de4f851a7a 100644 (file)
@@ -23824,23 +23824,25 @@ some cases that the feature will be dropped in the future.  In other
 cases, the feature might be gone already.
 
 While the list below is not exhaustive, it documents some of the options
-that are now deprecated:
+that are now deprecated or have been removed:
 
 @table @code
 @item -fexternal-templates
 @itemx -falt-external-templates
-These are two of the many ways for G++ to implement template
-instantiation.  @xref{Template Instantiation}.  The C++ standard clearly
-defines how template definitions have to be organized across
-implementation units.  G++ has an implicit instantiation mechanism that
-should work just fine for standard-conforming code.
+These are two options provided alternative methods of template
+instantiation.  @xref{Template Instantiation}.  The options have been removed.
 
 @item -fstrict-prototype
 @itemx -fno-strict-prototype
 Previously it was possible to use an empty prototype parameter list to
 indicate an unspecified number of parameters (like C), rather than no
-parameters, as C++ demands.  This feature has been removed, except where
-it is required for backwards compatibility.   @xref{Backwards Compatibility}.
+parameters, as C++ demands.  This feature has been removed.
+
+@item -fno-for-scope
+@item -ffriend-injection
+These two options provide compatibility with pre-standard C++.
+@xref{Backwards Compatibility}.
+
 @end table
 
 G++ allows a virtual function returning @samp{void *} to be overridden
@@ -23879,6 +23881,14 @@ initializers for static members of const integral types and const
 enumeration types so this extension has been deprecated and will be removed
 from a future version.
 
+G++ allows attributes to follow a parenthesized direct initializer,
+e.g.@: @samp{ int f (0) __attribute__ ((something)); } This extension
+has been ignored since G++ 3.3 and is deprecated.
+
+G++ allows anonymous structs and unions to have members that are not
+public non-static data members (i.e.@: fields).  These extensions are
+deprecated.
+
 @node Backwards Compatibility
 @section Backwards Compatibility
 @cindex Backwards Compatibility
index ee0a40bab3dc3a7393d98772a5d72d8f76816064..a9deebe170c54ba41e93c4ff0c04f2bda54fdcbc 100644 (file)
@@ -1,5 +1,12 @@
 2018-03-21  Nathan Sidwell  <nathan@acm.org>
 
+       * g++.dg/ext/anon-struct6.C: Adjust.
+       * g++.dg/ext/deprecate-1.C: New.
+       * g++.dg/ext/deprecate-2.C: New.
+       * g++.dg/lookup/pr84602.C: Adjust.
+       * g++.dg/lookup/pr84962.C: Adjust.
+       * g++.old-deja/g++.other/anon4.C
+
        PR c++/84836
        * g++.dg/lookup/pr84836.C: New.
 
index 9b59085f67099fd77ba0f594056650690f4f1cd3..360f25027a310b0572af71d536f811286703f221 100644 (file)
@@ -5,6 +5,6 @@ struct A
   struct
   {
     struct { static int i; }; // { dg-error "prohibits anonymous structs|non-static data members|unnamed class" }
-    void foo() { i; } // { dg-error "can only have non-static data" }
+    void foo() { i; } // { dg-error "public non-static data" }
   }; // { dg-error "prohibits anonymous structs" }
 };
diff --git a/gcc/testsuite/g++.dg/ext/deprecate-1.C b/gcc/testsuite/g++.dg/ext/deprecate-1.C
new file mode 100644 (file)
index 0000000..a23b71b
--- /dev/null
@@ -0,0 +1,22 @@
+// be pickier about anon-union and structs
+// { dg-options "-fpermissive" }
+
+struct X
+{
+  struct 
+  {
+    int f1 (); // { dg-warning "public non-static data" }
+    // { dg-message "will be removed" "" { target *-*-* } .-1 }
+    typedef int t1;  // { dg-warning "public non-static data" }
+  private:
+    int m1; // { dg-warning "public non-static data" }
+  };
+
+  union
+  {
+    int f2 (); // { dg-warning "public non-static data" }
+    typedef int t2; // { dg-warning "public non-static data" }
+  protected:
+    int m2; // { dg-warning "public non-static data" }
+  };
+};
diff --git a/gcc/testsuite/g++.dg/ext/deprecate-2.C b/gcc/testsuite/g++.dg/ext/deprecate-2.C
new file mode 100644 (file)
index 0000000..5fcab2f
--- /dev/null
@@ -0,0 +1,4 @@
+// Stop accepting attributes after a parenthesized initializer
+// { dg-options "-fpermissive" }
+int i (0) __attribute__ ((ignored)); // { dg-warning "attributes" }
+// { dg-message "will be removed" "" { target *-*-* } .-1 }
index d388ae003604010687000f489833915feb13c893..e1fc146a9cef257957c888b8ec2419bdfb327ba4 100644 (file)
@@ -3,7 +3,7 @@
 
 struct X {
   union {
-    class a; // { dg-warning "can only have" }
+    class a; // { dg-warning "public non-static data member" }
   };
   a *b;
 };
@@ -11,7 +11,7 @@ X::a *a;
 
 struct Y {
   union {
-    class a; // { dg-warning "can only have" }
+    class a; // { dg-warning "public non-static data member" }
     int a;
   };
   class a *b;
@@ -23,7 +23,7 @@ struct Z {
   union {
     // Force MEMBER_VEC creation
     int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10;
-    class a; // { dg-warning "can only have" }
+    class a; // { dg-warning "public non-static data member" }
     int a;
   };
   class a *b;
index ee801c247bcabffda300fd8e3ade94eafd7e8574..b9b7a3135266693097737cca1eb8a1581aaaf5ac 100644 (file)
@@ -6,7 +6,7 @@ struct X {
   struct 
   {
     template <typename> int a ();
-    // { dg-error "can only have" "" { target *-*-* } .-1 }
+    // { dg-error "public non-static data member" "" { target *-*-* } .-1 }
   };
 
   int  : a; // { dg-error "non-integral" }
index b6cb3006d713cf980b3d398a061b7dd41eeece26..e6ed91b77cadb236866c99164265f069891382ce 100644 (file)
@@ -11,6 +11,6 @@ struct A
 {
   union
   {
-    void bad(); // { dg-error "can only have non-static data" }
+    void bad(); // { dg-error "public non-static data member" }
   };
 };