aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2024-09-05 13:01:59 -0400
committerMarek Polacek <polacek@redhat.com>2024-09-05 15:21:47 -0400
commitd9d34f9a91371dea4bab0b54b2d7f762a6cc23e0 (patch)
tree791d884f688fdf693a90b3f4a6785aa5e92546d5 /gcc
parent7d1483921941d21d91f929ef0d59a9794b1946b4 (diff)
downloadgcc-d9d34f9a91371dea4bab0b54b2d7f762a6cc23e0.zip
gcc-d9d34f9a91371dea4bab0b54b2d7f762a6cc23e0.tar.gz
gcc-d9d34f9a91371dea4bab0b54b2d7f762a6cc23e0.tar.bz2
c++: vtable referring to "unavailable" virtual fn [PR116606]
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/decl2.cc3
-rw-r--r--gcc/testsuite/g++.dg/ext/attr-unavailable-13.C8
2 files changed, 10 insertions, 1 deletions
diff --git a/gcc/cp/decl2.cc b/gcc/cp/decl2.cc
index 3c4f348..0279372 100644
--- a/gcc/cp/decl2.cc
+++ b/gcc/cp/decl2.cc
@@ -2180,7 +2180,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
index 0000000..9ca4000
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/attr-unavailable-13.C
@@ -0,0 +1,8 @@
+// PR c++/116606
+// { dg-do compile }
+
+struct C {
+ __attribute__((unavailable)) virtual void f() {}
+};
+
+C c;