On the following testcase, we emit false positive warnings/errors about using
the deprecated or unavailable methods when creating thunks for them, even
when nothing (in the testcase so far) actually used those.
The following patch temporarily disables that diagnostics when creating
the thunks.
2024-09-12 Jakub Jelinek <jakub@redhat.com>
PR c++/116636
* method.cc: Include decl.h.
(use_thunk): Temporarily change deprecated_state to
UNAVAILABLE_DEPRECATED_SUPPRESS.
* g++.dg/warn/deprecated-19.C: New test.
(cherry picked from commit
4026d89d623e322920b052f7ac0d940ef267dc0f)
#include "coretypes.h"
#include "target.h"
#include "cp-tree.h"
+#include "decl.h"
#include "stringpool.h"
#include "cgraph.h"
#include "varasm.h"
/* Thunks are always addressable; they only appear in vtables. */
TREE_ADDRESSABLE (thunk_fndecl) = 1;
+ /* Don't diagnose deprecated or unavailable functions just because they
+ have thunks emitted for them. */
+ auto du = make_temp_override (deprecated_state,
+ UNAVAILABLE_DEPRECATED_SUPPRESS);
+
/* Figure out what function is being thunked to. It's referenced in
this translation unit. */
TREE_ADDRESSABLE (function) = 1;
--- /dev/null
+// PR c++/116636
+// { dg-do compile { target c++11 } }
+// { dg-options "-pedantic -Wdeprecated" }
+
+struct A {
+ virtual int foo () = 0;
+};
+struct B : virtual A {
+ [[deprecated]] int foo () { return 0; } // { dg-message "declared here" }
+};
+struct C : virtual A {
+ [[gnu::unavailable]] int foo () { return 0; } // { dg-message "declared here" }
+};
+
+void
+bar ()
+{
+ B b;
+ b.foo (); // { dg-warning "'virtual int B::foo\\\(\\\)' is deprecated" }
+ C c;
+ c.foo (); // { dg-error "'virtual int C::foo\\\(\\\)' is unavailable" }
+}