From: Jason Merrill Date: Thu, 18 Sep 2025 11:10:56 +0000 (+0200) Subject: c++: tweak constexpr union diagnostic X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=44e3e66a14ad8a7cd2afe62b5a42af23e4a89474;p=thirdparty%2Fgcc.git 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 --git a/gcc/cp/constexpr.cc b/gcc/cp/constexpr.cc index 1621e28da5c..6ebe6ebaef6 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 00000000000..2e3b101c8db --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp26/constexpr-new6a.C @@ -0,0 +1,17 @@ +// { dg-do compile { target c++26 } } + +#include + +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 b0c91d5ef97..d835602296c 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