https://gcc.gnu.org/g:b7b67732e20217196f2a13a10fc3df4605b2b2ab

commit r15-3628-gb7b67732e20217196f2a13a10fc3df4605b2b2ab
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Fri Sep 13 16:13:01 2024 +0200

    c++: Don't emit deprecated/unavailable attribute diagnostics when creating 
cdtor thunks [PR116678]
    
    Another spot where we mark_used a function (in this case ctor or dtor)
    even when it is just artificially used inside of thunks (emitted on mingw
    with -Os for the testcase).
    
    2024-09-13  Jakub Jelinek  <ja...@redhat.com>
    
            PR c++/116678
            * optimize.cc: Include decl.h.
            (maybe_thunk_body): Temporarily change deprecated_state to
            UNAVAILABLE_DEPRECATED_SUPPRESS.
    
            * g++.dg/warn/deprecated-20.C: New test.

Diff:
---
 gcc/cp/optimize.cc                        |  6 ++++++
 gcc/testsuite/g++.dg/warn/deprecated-20.C | 16 ++++++++++++++++
 2 files changed, 22 insertions(+)

diff --git a/gcc/cp/optimize.cc b/gcc/cp/optimize.cc
index b8791d8a9635..8429d856728f 100644
--- a/gcc/cp/optimize.cc
+++ b/gcc/cp/optimize.cc
@@ -23,6 +23,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "coretypes.h"
 #include "target.h"
 #include "cp-tree.h"
+#include "decl.h"
 #include "stringpool.h"
 #include "cgraph.h"
 #include "debug.h"
@@ -287,6 +288,11 @@ maybe_thunk_body (tree fn, bool force)
   if (ctor_omit_inherited_parms (fns[0]))
     return 0;
 
+  /* Don't diagnose deprecated or unavailable cdtors just because they
+     have thunks emitted for them.  */
+  auto du = make_temp_override (deprecated_state,
+                               UNAVAILABLE_DEPRECATED_SUPPRESS);
+
   DECL_ABSTRACT_P (fn) = false;
   if (!DECL_WEAK (fn))
     {
diff --git a/gcc/testsuite/g++.dg/warn/deprecated-20.C 
b/gcc/testsuite/g++.dg/warn/deprecated-20.C
new file mode 100644
index 000000000000..1911aeff4e37
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/deprecated-20.C
@@ -0,0 +1,16 @@
+// PR c++/116678
+// { dg-do compile }
+// { dg-options "-Os -pedantic" }
+
+struct S
+{
+  [[deprecated]] S () { s = 1; }       // { dg-bogus "'S::S\\\(\\\)' is 
deprecated" }
+  S (int x) { s = x; }                 // { dg-warning "C\\\+\\\+11 attributes 
only available with" "" { target c++98_only } .-1 }
+  ~S () {}
+  int s;
+};
+
+int
+main ()
+{
+}

Reply via email to