From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2122) id 3A8D9382F0BB; Wed, 25 May 2022 15:09:34 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 3A8D9382F0BB MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jason Merrill To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc r13-766] c++: strict constexpr and local vars X-Act-Checkin: gcc X-Git-Author: Jason Merrill X-Git-Refname: refs/heads/master X-Git-Oldrev: 1b661f3f5e712c951e774b3b91fffe4dac734cc7 X-Git-Newrev: 6209009df65ff68482ef66951856f50cf362d990 Message-Id: <20220525150934.3A8D9382F0BB@sourceware.org> Date: Wed, 25 May 2022 15:09:34 +0000 (GMT) X-BeenThere: libstdc++-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libstdc++-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 May 2022 15:09:34 -0000 https://gcc.gnu.org/g:6209009df65ff68482ef66951856f50cf362d990 commit r13-766-g6209009df65ff68482ef66951856f50cf362d990 Author: Jason Merrill Date: Sun May 22 15:04:33 2022 -0400 c++: strict constexpr and local vars A change I was working on made constexpr_searcher.cc start to fail, and when I looked at it I wondered why it had been accepted before. This turned out to be because we try to be more flexible about constant-evaluation of static initializers, as allowed, but we were wrongly doing the same for non-static initializers as well. gcc/cp/ChangeLog: * constexpr.cc (maybe_constant_init_1): Only pass false for strict when initializing a variable of static duration. libstdc++-v3/ChangeLog: * testsuite/20_util/function_objects/constexpr_searcher.cc: Add constexpr. gcc/testsuite/ChangeLog: * g++.dg/cpp1y/constexpr-local4.C: New test. Diff: --- gcc/cp/constexpr.cc | 12 +++++++++--- gcc/testsuite/g++.dg/cpp1y/constexpr-local4.C | 17 +++++++++++++++++ .../20_util/function_objects/constexpr_searcher.cc | 4 ++-- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/gcc/cp/constexpr.cc b/gcc/cp/constexpr.cc index 388239ea8a8..1a70fda1dc5 100644 --- a/gcc/cp/constexpr.cc +++ b/gcc/cp/constexpr.cc @@ -8301,9 +8301,15 @@ maybe_constant_init_1 (tree t, tree decl, bool allow_non_constant, else if (CONSTANT_CLASS_P (t) && allow_non_constant) /* No evaluation needed. */; else - t = cxx_eval_outermost_constant_expr (t, allow_non_constant, - /*strict*/false, - manifestly_const_eval, false, decl); + { + /* [basic.start.static] allows constant-initialization of variables with + static or thread storage duration even if it isn't required, but we + shouldn't bend the rules the same way for automatic variables. */ + bool is_static = (decl && DECL_P (decl) + && (TREE_STATIC (decl) || DECL_EXTERNAL (decl))); + t = cxx_eval_outermost_constant_expr (t, allow_non_constant, !is_static, + manifestly_const_eval, false, decl); + } if (TREE_CODE (t) == TARGET_EXPR) { tree init = TARGET_EXPR_INITIAL (t); diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-local4.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-local4.C new file mode 100644 index 00000000000..bef62488579 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/constexpr-local4.C @@ -0,0 +1,17 @@ +// { dg-do compile { target c++14 } } + +struct A +{ + int i; + constexpr A(int i): i(i) {}; +}; + +const A a = 42; + +constexpr int f() +{ + const int j = a.i; // { dg-message "'a'" } + return j; +} + +static_assert (f() == 42,""); // { dg-error "non-constant" } diff --git a/libstdc++-v3/testsuite/20_util/function_objects/constexpr_searcher.cc b/libstdc++-v3/testsuite/20_util/function_objects/constexpr_searcher.cc index 33012200cb0..17069694c1b 100644 --- a/libstdc++-v3/testsuite/20_util/function_objects/constexpr_searcher.cc +++ b/libstdc++-v3/testsuite/20_util/function_objects/constexpr_searcher.cc @@ -28,13 +28,13 @@ #include -const std::string_view +constexpr std::string_view patt = "World"; constexpr std::string_view greet = "Hello, Humongous World of Wonder!!!"; -const std::wstring_view +constexpr std::wstring_view wpatt = L"World"; constexpr std::wstring_view