re PR c++/16370 (__attribute__((deprecated)) not useful on classes, and ugly function...
authorJason Merrill <jason@redhat.com>
Sun, 23 Sep 2007 15:27:10 +0000 (11:27 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Sun, 23 Sep 2007 15:27:10 +0000 (11:27 -0400)
        PR c++/16370
        * decl.c (grokdeclarator): Look through implicit TYPE_DECLs
        for deprecation warnings.

From-SVN: r128691

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/g++.dg/warn/deprecated-5.C [new file with mode: 0644]
gcc/testsuite/g++.dg/warn/deprecated.C

index 26cc8322bf212b7e1e946c6aa65d871ff45a7260..79e96c6c42ca0bdff013d54a91e48ed910462ca4 100644 (file)
@@ -1,3 +1,9 @@
+2007-09-23  Jason Merrill  <jason@redhat.com>
+
+       PR c++/16370
+       * decl.c (grokdeclarator): Look through implicit TYPE_DECLs
+       for deprecation warnings.
+
 2007-09-22  Jason Merrill  <jason@redhat.com>
 
        PR c++/15269
index c589a4bf5cdbd813f90f58ca9a6f5233d855e0c4..b898a02d97064422f86113c2949fc1f5f1182132 100644 (file)
@@ -7512,6 +7512,10 @@ grokdeclarator (const cp_declarator *declarator,
     {
       typedef_decl = type;
       type = TREE_TYPE (typedef_decl);
+      if (TREE_DEPRECATED (type)
+         && DECL_ARTIFICIAL (typedef_decl)
+         && deprecated_state != DEPRECATED_SUPPRESS)
+       warn_deprecated_use (type);
     }
   /* No type at all: default to `int', and set DEFAULTED_INT
      because it was not a user-defined typedef.  */
diff --git a/gcc/testsuite/g++.dg/warn/deprecated-5.C b/gcc/testsuite/g++.dg/warn/deprecated-5.C
new file mode 100644 (file)
index 0000000..a015bd5
--- /dev/null
@@ -0,0 +1,4 @@
+// PR c++/16370
+
+struct Foo { int i; } __attribute__ ((deprecated));
+void foo() { Foo f; }          // { dg-warning "deprecated" }
index 15e8475e787d21e282b9a8e248470f2779f49b4a..210740814f953ae37f829999520c147cc5d332f4 100644 (file)
@@ -98,11 +98,11 @@ class T {
     int x;
 } __attribute__ ((deprecated));
 
-T *p3;
+T *p3;                         // { dg-warning "'T' is deprecated" }
 
 inline void T::member1(int) {}
 
-int T::member3(T *p)
+int T::member3(T *p)           // { dg-warning "'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" "" } */