[gcc r16-3963] c++: tweak constexpr union diagnostic

Jason Merrill jason@gcc.gnu.org
Thu Sep 18 21:48:26 GMT 2025


https://gcc.gnu.org/g:44e3e66a14ad8a7cd2afe62b5a42af23e4a89474

commit r16-3963-g44e3e66a14ad8a7cd2afe62b5a42af23e4a89474
Author: Jason Merrill <jason@redhat.com>
Date:   Thu Sep 18 13:10:56 2025 +0200

    c++: tweak constexpr union diagnostic
    
    It's now possible to see an active member of a union that has not actually
    been initialized, so let's clarify the diagnostic.
    
    gcc/cp/ChangeLog:
    
            * constexpr.cc (cxx_eval_component_reference): Clarify diagnostic.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/cpp2a/constexpr-98122.C: Adjust diagnostic.
            * g++.dg/cpp26/constexpr-new6a.C: New test.

Diff:
---
 gcc/cp/constexpr.cc                          |  2 +-
 gcc/testsuite/g++.dg/cpp26/constexpr-new6a.C | 17 +++++++++++++++++
 gcc/testsuite/g++.dg/cpp2a/constexpr-98122.C |  2 +-
 3 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/gcc/cp/constexpr.cc b/gcc/cp/constexpr.cc
index 1621e28da5c8..6ebe6ebaef63 100644
--- a/gcc/cp/constexpr.cc
+++ b/gcc/cp/constexpr.cc
@@ -5788,7 +5788,7 @@ cxx_eval_component_reference (const constexpr_ctx *ctx, tree t,
 	      if (cep->value == NULL_TREE)
 		error ("accessing uninitialized member %qD", part);
 	      else
-		error ("accessing %qD member instead of initialized %qD member "
+		error ("accessing %qD member instead of active %qD member "
 		       "in constant expression", part, cep->index);
 	    }
 	  *non_constant_p = true;
diff --git a/gcc/testsuite/g++.dg/cpp26/constexpr-new6a.C b/gcc/testsuite/g++.dg/cpp26/constexpr-new6a.C
new file mode 100644
index 000000000000..2e3b101c8db3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp26/constexpr-new6a.C
@@ -0,0 +1,17 @@
+// { dg-do compile { target c++26 } }
+
+#include <new>
+
+union U { double d; int i; };
+
+constexpr int f()
+{
+  U u;
+  new (&u.i) int;
+  return u.d;			// { dg-error "active" }
+}
+
+int main ()
+{
+  constexpr int i = f();	// { dg-message "" }
+}
diff --git a/gcc/testsuite/g++.dg/cpp2a/constexpr-98122.C b/gcc/testsuite/g++.dg/cpp2a/constexpr-98122.C
index b0c91d5ef97a..d835602296c8 100644
--- a/gcc/testsuite/g++.dg/cpp2a/constexpr-98122.C
+++ b/gcc/testsuite/g++.dg/cpp2a/constexpr-98122.C
@@ -9,7 +9,7 @@ bar ()
 {
   V f { .b = 42 };
   constexpr auto m = &V::a;
-  return (f.*m) == 42;  // { dg-error "accessing 'V::a' member instead of initialized 'V::b' member in constant expression" }
+  return (f.*m) == 42;  // { dg-error "accessing 'V::a' member instead of active 'V::b' member in constant expression" }
 }
 
 constexpr bool


More information about the Gcc-cvs mailing list