From: Jason Merrill Date: Tue, 20 Sep 2022 21:12:29 +0000 (-0400) Subject: c++: check DECL_INITIAL for constexpr X-Git-Tag: basepoints/gcc-14~4242 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=73d9b0e5947e162386f7e25d3851097cee1bb366;p=thirdparty%2Fgcc.git c++: check DECL_INITIAL for constexpr We were overlooking non-potentially-constant bits in variable initializer because we didn't walk into DECL_INITIAL. gcc/cp/ChangeLog: * constexpr.cc (potential_constant_expression_1): Look into DECL_INITIAL. Use location wrappers. gcc/testsuite/ChangeLog: * g++.dg/cpp1y/constexpr-local4.C: Expect error sooner. * g++.dg/cpp2a/consteval24.C: Likewise. * g++.dg/cpp2a/consteval7.C: Likewise. * g++.dg/cpp2a/inline-asm3.C: Likewise. --- diff --git a/gcc/cp/constexpr.cc b/gcc/cp/constexpr.cc index 10639876d9cf..ed41d7552696 100644 --- a/gcc/cp/constexpr.cc +++ b/gcc/cp/constexpr.cc @@ -8892,7 +8892,10 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict, bool now, { tree from = TREE_OPERAND (t, 0); if (location_wrapper_p (t)) - return (RECUR (from, want_rval)); + { + iloc_sentinel ils = loc; + return (RECUR (from, want_rval)); + } if (INDIRECT_TYPE_P (TREE_TYPE (t))) { STRIP_ANY_LOCATION_WRAPPER (from); @@ -9348,7 +9351,7 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict, bool now, (tmp, /*constexpr_context_p=*/true, flags)) return false; } - return RECUR (tmp, want_rval); + return RECUR (DECL_INITIAL (tmp), want_rval); case TRY_FINALLY_EXPR: return (RECUR (TREE_OPERAND (t, 0), want_rval) diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-local4.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-local4.C index bef624885792..647b5dcd7cd5 100644 --- a/gcc/testsuite/g++.dg/cpp1y/constexpr-local4.C +++ b/gcc/testsuite/g++.dg/cpp1y/constexpr-local4.C @@ -10,8 +10,8 @@ const A a = 42; constexpr int f() { - const int j = a.i; // { dg-message "'a'" } + const int j = a.i; // { dg-error "'a'" } return j; } -static_assert (f() == 42,""); // { dg-error "non-constant" } +static_assert (f() == 42,""); // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/cpp2a/consteval24.C b/gcc/testsuite/g++.dg/cpp2a/consteval24.C index 6d0c63c749be..6d7034c5515e 100644 --- a/gcc/testsuite/g++.dg/cpp2a/consteval24.C +++ b/gcc/testsuite/g++.dg/cpp2a/consteval24.C @@ -27,4 +27,4 @@ bar () return fn1 () + fn2 () + (s.*fn3) () + (s.*fn4) () + fn5 () + (s.*fn6) () + (s.*fn7) (); } -auto a = bar (); +auto a = bar (); // { dg-error "bar" } diff --git a/gcc/testsuite/g++.dg/cpp2a/consteval7.C b/gcc/testsuite/g++.dg/cpp2a/consteval7.C index 23f3d25a39e0..74996d31a82e 100644 --- a/gcc/testsuite/g++.dg/cpp2a/consteval7.C +++ b/gcc/testsuite/g++.dg/cpp2a/consteval7.C @@ -10,4 +10,4 @@ consteval int qux () { S s = baz (); return s.b + s.c (); } consteval int quux () { constexpr S s = baz (); return s.b + s.c (); } // { dg-error "immediate evaluation returns address of immediate function 'consteval int foo\\(\\)'" } constexpr auto d = baz (); // { dg-error "immediate evaluation returns address of immediate function 'consteval int foo\\(\\)'" } constexpr auto e = qux (); -constexpr auto f = quux (); +constexpr auto f = quux (); // { dg-error "quux" } diff --git a/gcc/testsuite/g++.dg/cpp2a/inline-asm3.C b/gcc/testsuite/g++.dg/cpp2a/inline-asm3.C index a7476b1d9d1a..a6f612e2447e 100644 --- a/gcc/testsuite/g++.dg/cpp2a/inline-asm3.C +++ b/gcc/testsuite/g++.dg/cpp2a/inline-asm3.C @@ -9,4 +9,4 @@ foo () return i; } -constexpr int i = foo (); +constexpr int i = foo (); // { dg-error "foo" }