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

commit r14-10648-gfe668633f6b5819ba04d80f13343ee7f5bba1c5b
Author: Marek Polacek <pola...@redhat.com>
Date:   Thu Sep 5 13:01:59 2024 -0400

    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.
    
    (cherry picked from commit d9d34f9a91371dea4bab0b54b2d7f762a6cc23e0)

Diff:
---
 gcc/cp/decl2.cc                                | 3 ++-
 gcc/testsuite/g++.dg/ext/attr-unavailable-13.C | 8 ++++++++
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/gcc/cp/decl2.cc b/gcc/cp/decl2.cc
index af2e08c8a63..f6c760338cc 100644
--- a/gcc/cp/decl2.cc
+++ b/gcc/cp/decl2.cc
@@ -2172,7 +2172,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 00000000000..9ca40005419
--- /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;

Reply via email to