https://gcc.gnu.org/g:3f0eccfd90370a7c5300f92493143c7e5a66be85

commit r16-10-g3f0eccfd90370a7c5300f92493143c7e5a66be85
Author: Jason Merrill <ja...@redhat.com>
Date:   Wed Apr 16 16:02:09 2025 -0400

    c++: constexpr virtual base diagnostic
    
    I thought this diagnostic could be clearer that the problem is the
    combination of virtual bases and constexpr constructor, not just complain
    that the class has virtual bases without context.
    
    gcc/cp/ChangeLog:
    
            * constexpr.cc (is_valid_constexpr_fn): Improve diagnostic.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/cpp2a/constexpr-dtor16.C: Adjust diagnostic.
            * g++.dg/cpp2a/constexpr-dynamic10.C: Likewise.

Diff:
---
 gcc/cp/constexpr.cc                              | 9 ++++++++-
 gcc/testsuite/g++.dg/cpp2a/constexpr-dtor16.C    | 2 +-
 gcc/testsuite/g++.dg/cpp2a/constexpr-dynamic10.C | 2 +-
 3 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/gcc/cp/constexpr.cc b/gcc/cp/constexpr.cc
index 8a5b68c71faf..f56c5c42c821 100644
--- a/gcc/cp/constexpr.cc
+++ b/gcc/cp/constexpr.cc
@@ -307,7 +307,14 @@ is_valid_constexpr_fn (tree fun, bool complain)
     {
       ret = false;
       if (complain)
-       error ("%q#T has virtual base classes", DECL_CONTEXT (fun));
+       {
+         if (DECL_CONSTRUCTOR_P (fun))
+           error ("%<constexpr%> constructor in %q#T that has "
+                  "virtual base classes", DECL_CONTEXT (fun));
+         else
+           error ("%<constexpr%> destructor in %q#T that has "
+                  "virtual base classes", DECL_CONTEXT (fun));
+       }
     }
 
   return ret;
diff --git a/gcc/testsuite/g++.dg/cpp2a/constexpr-dtor16.C 
b/gcc/testsuite/g++.dg/cpp2a/constexpr-dtor16.C
index b84aaf95b9d0..99d130705713 100644
--- a/gcc/testsuite/g++.dg/cpp2a/constexpr-dtor16.C
+++ b/gcc/testsuite/g++.dg/cpp2a/constexpr-dtor16.C
@@ -3,5 +3,5 @@
 
 struct A { virtual ~A (); };
 struct B : virtual A { constexpr ~B () {} };
-// { dg-error "'struct B' has virtual base classes" "" { target c++20 } .-1 }
+// { dg-error "'constexpr' destructor in 'struct B' that has virtual base 
classes" "" { target c++20 } .-1 }
 // { dg-error "'constexpr' destructors only available with" "" { target 
c++17_down } .-2 }
diff --git a/gcc/testsuite/g++.dg/cpp2a/constexpr-dynamic10.C 
b/gcc/testsuite/g++.dg/cpp2a/constexpr-dynamic10.C
index f9f82236d15f..e543ce46b518 100644
--- a/gcc/testsuite/g++.dg/cpp2a/constexpr-dynamic10.C
+++ b/gcc/testsuite/g++.dg/cpp2a/constexpr-dynamic10.C
@@ -5,7 +5,7 @@
 
 struct C { virtual void a(); };
 struct B { virtual void b(); };
-struct A : virtual B, C { virtual void c(); }; // { dg-error ".struct A. has 
virtual base classes" }
+struct A : virtual B, C { virtual void c(); }; // { dg-error "virtual base 
classes" }
 
 constexpr A a; // { dg-error "call" }

Reply via email to