]> 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>
Mon, 25 Jun 2018 17:32:10 +0000 (19:32 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 25 Jun 2018 17:32:10 +0000 (19:32 +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: r262075

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 4b783360ade1661bd79beb50e0c6c37f498609d7..99f8f149a1e0489e8bd51f897dfe5f876fbca0c3 100644 (file)
@@ -1,6 +1,16 @@
 2018-06-25  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 9bd9afa41cb05c243246552b59f55703b9c54a14..b5c636fcc90b9f0ca2da16cdd5618d3cd933ba63 100644 (file)
@@ -6571,6 +6571,7 @@ extern bool cxx_type_hash_eq                      (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 d431227fdd8d7bb93d9fbd29669a93301962cf75..b86dabf24237a4be1df9d62e7c18d4885324e862 100644 (file)
@@ -9594,7 +9594,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;
@@ -9602,7 +9602,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.  */
@@ -10287,8 +10287,18 @@ grokdeclarator (const cp_declarator *declarator,
                  error ("a conversion function cannot have a trailing return type");
              }
 
-           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
@@ -11782,7 +11792,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 c1e6dbb805ddd545d0bbcf668f9257a68491f5f8..8077e9ae3e827f98b6a277780bddc2cef472ec67 100644 (file)
@@ -4568,6 +4568,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 8df7a10ef00053bb20cb49dbc18b8459194dfc87..69ad170ee37163247b05574cd90d7da86a71c623 100644 (file)
@@ -1933,7 +1933,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 69ab82d64ca4a67b1363065d9848cece63d8a034..8f9eb960f9d2ae252cd0a63753799248efd85119 100644 (file)
@@ -1,6 +1,13 @@
 2018-06-25  Jakub Jelinek  <jakub@redhat.com>
 
        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.
+
        2018-03-09  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/84772
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 4afb2841a74aafbf976feabf4df12ee3f0d10040..42a215b9419f178e19277fc083a52075ac4423db 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 210740814f953ae37f829999520c147cc5d332f4..6e1dd08509e0c6c8bbf93e0a02ed542489992104 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
-
-