]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR c++/84222 ([[deprecated]] class complains about internal class usage)
authorJakub Jelinek <jakub@redhat.com>
Fri, 22 Jun 2018 20:43:09 +0000 (22:43 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 22 Jun 2018 20:43:09 +0000 (22:43 +0200)
Backported from mainline
2018-03-15  Jakub Jelinek  <jakub@redhat.com>

PR c++/84222
* cp-tree.h (cp_warn_deprecated_use): Declare.
* tree.c (cp_warn_deprecated_use): New function.
* typeck2.c (build_functional_cast): Use it.
* decl.c (grokparms): Likewise.
(grokdeclarator): Likewise.  Temporarily push nested class scope
around grokparms call for out of class member definitions.

* g++.dg/warn/deprecated.C (T::member3): Change dg-warning to dg-bogus.
* g++.dg/warn/deprecated-6.C (T::member3): Likewise.
* g++.dg/warn/deprecated-13.C: New test.

From-SVN: r261924

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/tree.c
gcc/cp/typeck2.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/deprecated-13.C [new file with mode: 0644]
gcc/testsuite/g++.dg/warn/deprecated-6.C
gcc/testsuite/g++.dg/warn/deprecated.C

index 0ddafc8a1b4df8274ffcc8b9c4e604281ee8c09f..78c475ddee04b85bb66a22f6e2759c5096460764 100644 (file)
@@ -1,6 +1,16 @@
 2018-06-22  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2018-03-15  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/84222
+       * cp-tree.h (cp_warn_deprecated_use): Declare.
+       * tree.c (cp_warn_deprecated_use): New function.
+       * typeck2.c (build_functional_cast): Use it.
+       * decl.c (grokparms): Likewise.
+       (grokdeclarator): Likewise.  Temporarily push nested class scope
+       around grokparms call for out of class member definitions.
+
        2018-03-09  Jason Merrill  <jason@redhat.com>
                    Jakub Jelinek  <jakub@redhat.com>
 
index fadf6ecb1a2358109cf228fd3604d496939e38a7..8251f85eded3c3b63ede465aac15b11e1dda90d9 100644 (file)
@@ -6708,6 +6708,7 @@ extern tree cxx_copy_lang_qualifiers              (const_tree, const_tree);
 
 extern void cxx_print_statistics               (void);
 extern bool maybe_warn_zero_as_null_pointer_constant (tree, location_t);
+extern void cp_warn_deprecated_use             (tree);
 
 /* in ptree.c */
 extern void cxx_print_xnode                    (FILE *, tree, int);
index 836506ef7beebbe47857ed25311aef7319f93af1..a0c634fd56668912e68905d445a766788d26bfa0 100644 (file)
@@ -10400,7 +10400,7 @@ grokdeclarator (const cp_declarator *declarator,
      suppress reports of deprecated items.  */
   if (type && TREE_DEPRECATED (type)
       && deprecated_state != DEPRECATED_SUPPRESS)
-    warn_deprecated_use (type, NULL_TREE);
+    cp_warn_deprecated_use (type);
   if (type && TREE_CODE (type) == TYPE_DECL)
     {
       typedef_decl = type;
@@ -10408,7 +10408,7 @@ grokdeclarator (const cp_declarator *declarator,
       if (TREE_DEPRECATED (type)
          && DECL_ARTIFICIAL (typedef_decl)
          && deprecated_state != DEPRECATED_SUPPRESS)
-       warn_deprecated_use (type, NULL_TREE);
+       cp_warn_deprecated_use (type);
     }
   /* No type at all: default to `int', and set DEFAULTED_INT
      because it was not a user-defined typedef.  */
@@ -11203,8 +11203,18 @@ grokdeclarator (const cp_declarator *declarator,
                  explicitp = 2;
              }
 
-           arg_types = grokparms (declarator->u.function.parameters,
-                                  &parms);
+           tree pushed_scope = NULL_TREE;
+           if (funcdecl_p
+               && decl_context != FIELD
+               && inner_declarator->u.id.qualifying_scope
+               && CLASS_TYPE_P (inner_declarator->u.id.qualifying_scope))
+             pushed_scope
+               = push_scope (inner_declarator->u.id.qualifying_scope);
+
+           arg_types = grokparms (declarator->u.function.parameters, &parms);
+
+           if (pushed_scope)
+             pop_scope (pushed_scope);
 
            if (inner_declarator
                && inner_declarator->kind == cdk_id
@@ -12721,7 +12731,7 @@ grokparms (tree parmlist, tree *parms)
            {
              tree deptype = type_is_deprecated (type);
              if (deptype)
-               warn_deprecated_use (deptype, NULL_TREE);
+               cp_warn_deprecated_use (deptype);
            }
 
          /* Top-level qualifiers on the parameters are
index 5fef52674f68a3230da3f850f2013d5d3acbedb6..e6e05c1f8f7dfd94142a91c196eba36f1a84daa2 100644 (file)
@@ -4900,6 +4900,19 @@ cp_tree_code_length (enum tree_code code)
     }
 }
 
+/* Wrapper around warn_deprecated_use that doesn't warn for
+   current_class_type.  */
+
+void
+cp_warn_deprecated_use (tree node)
+{
+  if (TYPE_P (node)
+      && current_class_type
+      && TYPE_MAIN_VARIANT (node) == current_class_type)
+    return;
+  warn_deprecated_use (node, NULL_TREE);
+}
+
 /* Implement -Wzero_as_null_pointer_constant.  Return true if the
    conditions for the warning hold, false otherwise.  */
 bool
index 764fbca832d65cd233f447b93f1f5830c88dc1bd..c8b9d787ac5974ebee649342c701839021254f1f 100644 (file)
@@ -1957,7 +1957,7 @@ build_functional_cast (tree exp, tree parms, tsubst_flags_t complain)
       if (complain & tf_warning
          && TREE_DEPRECATED (type)
          && DECL_ARTIFICIAL (exp))
-       warn_deprecated_use (type, NULL_TREE);
+       cp_warn_deprecated_use (type);
     }
   else
     type = exp;
index 50274291efc3396e4287922baf2aa5e4de5d3018..304ec3ac47ee7290fe53b619ebfbcb87d472e67d 100644 (file)
@@ -3,6 +3,11 @@
        Backported from mainline
        2018-03-15  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/84222
+       * g++.dg/warn/deprecated.C (T::member3): Change dg-warning to dg-bogus.
+       * g++.dg/warn/deprecated-6.C (T::member3): Likewise.
+       * g++.dg/warn/deprecated-13.C: New test.
+
        PR target/84860
        * gcc.c-torture/compile/pr84860.c: New test.
 
diff --git a/gcc/testsuite/g++.dg/warn/deprecated-13.C b/gcc/testsuite/g++.dg/warn/deprecated-13.C
new file mode 100644 (file)
index 0000000..ef05b95
--- /dev/null
@@ -0,0 +1,44 @@
+// PR c++/84222
+// { dg-do compile }
+
+struct __attribute__((deprecated)) C {         // { dg-message "declared here" }
+  C () {}
+  C (const C &);                               // { dg-bogus "'C' is deprecated" }
+  C (const C &x, const C &y) { C z = x; }      // { dg-bogus "'C' is deprecated" }
+  void foo (const C &x, const C &y);           // { dg-bogus "'C' is deprecated" }
+};
+
+void
+C::foo (const C &x, const C &y)                        // { dg-bogus "'C' is deprecated" }
+{
+  C z = x;                                     // { dg-bogus "'C' is deprecated" }
+}
+
+void
+bar (const C &x, const C &y)                   // { dg-warning "'C' is deprecated" }
+{
+  C z = x;                                     // { dg-warning "'C' is deprecated" }
+}
+
+template <int N>
+struct __attribute__((deprecated)) D {         // { dg-message "declared here" }
+  D () {}
+  D (const D &);                               // { dg-bogus "is deprecated" }
+  D (const D &x, const D &y) { D z = x; }      // { dg-bogus "is deprecated" }
+  void foo (const D &x, const D &y);           // { dg-bogus "is deprecated" }
+};
+
+template <int N>
+void
+D<N>::foo                                      // { dg-bogus "is deprecated" "" { xfail *-*-* } }
+(const D &x, const D &y)                       // { dg-bogus "is deprecated" }
+{
+  D z = x;                                     // { dg-bogus "is deprecated" }
+}
+
+template <int N>
+void
+bar (const D<N> &x, const D<N> &y)             // { dg-warning "is deprecated" }
+{
+  D<N> z = x;                                  // { dg-warning "is deprecated" }
+}
index ad9eb3d4820f7d6a4b3e09bf4a0f0f4130b55bc5..682e9b226ca6f5f25e21f1d9fb7403cecd37b802 100644 (file)
@@ -98,7 +98,7 @@ T *p3;                                // { dg-warning "'T' is deprecated: Please avoid T" }
 
 inline void T::member1(int) {}
 
-int T::member3(T *p)           // { dg-warning "'T' is deprecated: Please avoid T" }
+int T::member3(T *p)           // { dg-bogus "'T' is deprecated: Please avoid T" }
 {
   p->member1(1);                       /* { dg-warning "'void T::member1\\(int\\)' is deprecated: Please avoid member1" "" } */
   (*p).member1(2);                     /* { dg-warning "'void T::member1\\(int\\)' is deprecated: Please avoid member1" "" } */
index a5b2aee03e36a19592f43699a024427be0ee7cd3..0420a6afd22d3eaab8d3962b67eba166b2c7e1ce 100644 (file)
@@ -102,7 +102,7 @@ T *p3;                              // { dg-warning "'T' is deprecated" }
 
 inline void T::member1(int) {}
 
-int T::member3(T *p)           // { dg-warning "'T' is deprecated" }
+int T::member3(T *p)           // { dg-bogus "'T' is deprecated" }
 {
   p->member1(1);                       /* { dg-warning "'void T::member1\\(int\\)' is deprecated" "" } */
   (*p).member1(2);                     /* { dg-warning "'void T::member1\\(int\\)' is deprecated" "" } */
@@ -113,5 +113,3 @@ int T::member3(T *p)                // { dg-warning "'T' is deprecated" }
   return f1();                                 /* { dg-warning "'INT1 f1\\(\\)' is deprecated" "" } */
 }
 #endif
-
-