From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1888) id 2BDC038515E0; Thu, 10 Jun 2021 22:46:42 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2BDC038515E0 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Patrick Palka To: gcc-cvs@gcc.gnu.org Subject: [gcc r11-8549] c++: normalization of non-templated return-type-req [PR100946] X-Act-Checkin: gcc X-Git-Author: Patrick Palka X-Git-Refname: refs/heads/releases/gcc-11 X-Git-Oldrev: 44b27aec1e9567489ba8fb04fa0dd313bc6c0c61 X-Git-Newrev: ae96e217ef82502312bed7e195a30ca5c67ca7ef Message-Id: <20210610224642.2BDC038515E0@sourceware.org> Date: Thu, 10 Jun 2021 22:46:42 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 10 Jun 2021 22:46:42 -0000 https://gcc.gnu.org/g:ae96e217ef82502312bed7e195a30ca5c67ca7ef commit r11-8549-gae96e217ef82502312bed7e195a30ca5c67ca7ef Author: Patrick Palka Date: Thu Jun 10 18:31:18 2021 -0400 c++: normalization of non-templated return-type-req [PR100946] Here the satisfaction cache is conflating the satisfaction value of the two return-type-requirements because the corresponding constrained 'auto's have level 2, but they capture an empty current_template_parms. This ultimately causes the satisfaction cache to think the type constraint doesn't depend on the deduced type of the expression. When normalizing the constraints on an 'auto', the assumption made by normalize_placeholder_type_constraints is that the level of the 'auto' is one greater than the depth of the captured current_template_parms, an assumption which is not holding here. So this patch just makes n_p_t_c adjust the normalization context appropriately in this situation. PR c++/100946 gcc/cp/ChangeLog: * constraint.cc (normalize_placeholder_type_constraints): When normalizing a non-templated return-type-requirement, add a dummy level to initial_parms. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/concepts-return-req3.C: New test. (cherry picked from commit 206db06ee380f490db0293af4ea7a4d590abd78c) Diff: --- gcc/cp/constraint.cc | 9 +++++++++ gcc/testsuite/g++.dg/cpp2a/concepts-return-req3.C | 6 ++++++ 2 files changed, 15 insertions(+) diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc index 0709695fd08..6baaa0650b0 100644 --- a/gcc/cp/constraint.cc +++ b/gcc/cp/constraint.cc @@ -3088,6 +3088,15 @@ normalize_placeholder_type_constraints (tree t, bool diag) scope for this placeholder type; use them as the initial template parameters for normalization. */ tree initial_parms = TREE_PURPOSE (ci); + + if (!initial_parms && TEMPLATE_TYPE_LEVEL (t) == 2) + /* This is a return-type-requirement of a non-templated requires-expression, + which are parsed under processing_template_decl == 1 and empty + current_template_parms; hence the 'auto' has level 2 and initial_parms + is empty. Fix up initial_parms to be consistent with the value of + processing_template_decl whence the 'auto' was created. */ + initial_parms = build_tree_list (size_int (1), make_tree_vec (0)); + /* The 'auto' itself is used as the first argument in its own constraints, and its level is one greater than its template depth. So in order to capture all used template parameters, we need to add an extra level of diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-return-req3.C b/gcc/testsuite/g++.dg/cpp2a/concepts-return-req3.C new file mode 100644 index 00000000000..a546c6457be --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-return-req3.C @@ -0,0 +1,6 @@ +// PR c++/100946 +// { dg-do compile { target c++20 } } + +template concept C = __is_same(T, int); +static_assert(requires { { 0 } -> C; }); +static_assert(requires { { true } -> C; }); // { dg-error "failed" }