]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: vtable referring to "unavailable" virtual fn [PR116606]
authorMarek Polacek <polacek@redhat.com>
Thu, 5 Sep 2024 17:01:59 +0000 (13:01 -0400)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 13 Jun 2025 11:34:05 +0000 (13:34 +0200)
mark_vtable_entries already has

   /* It's OK for the vtable to refer to deprecated virtual functions.  */
   warning_sentinel w(warn_deprecated_decl);

but that doesn't cover __attribute__((unavailable)).  We can use the
following override to cover both.

PR c++/116606

gcc/cp/ChangeLog:

* decl2.cc (mark_vtable_entries): Temporarily override deprecated_state to
UNAVAILABLE_DEPRECATED_SUPPRESS.  Remove a warning_sentinel.

gcc/testsuite/ChangeLog:

* g++.dg/ext/attr-unavailable-13.C: New test.

(cherry picked from commit d9d34f9a91371dea4bab0b54b2d7f762a6cc23e0)

gcc/cp/decl2.cc
gcc/testsuite/g++.dg/ext/attr-unavailable-13.C [new file with mode: 0644]

index f459828cadf7164cf180addcf3530f7826116530..e48a6c2ddc779f5205cd1325cd7816c1b1836bcb 100644 (file)
@@ -2058,7 +2058,8 @@ static void
 mark_vtable_entries (tree decl, vec<tree> &consteval_vtables)
 {
   /* It's OK for the vtable to refer to deprecated virtual functions.  */
-  warning_sentinel w(warn_deprecated_decl);
+  auto du = make_temp_override (deprecated_state,
+                               UNAVAILABLE_DEPRECATED_SUPPRESS);
 
   bool consteval_seen = false;
 
diff --git a/gcc/testsuite/g++.dg/ext/attr-unavailable-13.C b/gcc/testsuite/g++.dg/ext/attr-unavailable-13.C
new file mode 100644 (file)
index 0000000..9ca4000
--- /dev/null
@@ -0,0 +1,8 @@
+// PR c++/116606
+// { dg-do compile }
+
+struct C {
+    __attribute__((unavailable)) virtual void f() {}
+};
+
+C c;