From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1888) id 089103860C32; Wed, 21 Apr 2021 14:27:33 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 089103860C32 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 r10-9743] c++: alias_ctad_tweaks and constrained dguide [PR95486] X-Act-Checkin: gcc X-Git-Author: Patrick Palka X-Git-Refname: refs/heads/releases/gcc-10 X-Git-Oldrev: 525c2634c1f945072eaa14b6d264b1904b6f81ea X-Git-Newrev: 4806f9157a26cfd66c083bcc01596ff33009c0d6 Message-Id: <20210421142733.089103860C32@sourceware.org> Date: Wed, 21 Apr 2021 14:27:33 +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: Wed, 21 Apr 2021 14:27:33 -0000 https://gcc.gnu.org/g:4806f9157a26cfd66c083bcc01596ff33009c0d6 commit r10-9743-g4806f9157a26cfd66c083bcc01596ff33009c0d6 Author: Patrick Palka Date: Wed Jul 29 22:06:41 2020 -0400 c++: alias_ctad_tweaks and constrained dguide [PR95486] In the below testcase, we're ICEing from alias_ctad_tweaks ultimately because the implied deduction guide for X's user-defined constructor already has constraints associated with it. We then carry over these constraints to 'fprime', the overlying deduction guide for the alias template Y, via tsubst_decl from alias_ctad_tweaks. Later in alias_ctad_tweaks we call get_constraints followed by set_constraints without doing remove_constraints in between, which triggers the !found assert in set_constraints. This patch fixes this issue by adding an intervening call to remove_constraints. gcc/cp/ChangeLog: PR c++/95486 * pt.c (alias_ctad_tweaks): Call remove_constraints before calling set_constraints. gcc/testsuite/ChangeLog: PR c++/95486 * g++.dg/cpp2a/class-deduction-alias3.C: New test. (cherry picked from commit 71141b1bd537cc516e485c834c2d36abba3f4544) Diff: --- gcc/cp/pt.c | 5 ++++- gcc/testsuite/g++.dg/cpp2a/class-deduction-alias3.C | 11 +++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 76c7e428ecd..ae396e056c5 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -28823,7 +28823,10 @@ alias_ctad_tweaks (tree tmpl, tree uguides) } if (ci) - set_constraints (fprime, ci); + { + remove_constraints (fprime); + set_constraints (fprime, ci); + } } else { diff --git a/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias3.C b/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias3.C new file mode 100644 index 00000000000..318d4c942ce --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias3.C @@ -0,0 +1,11 @@ +// PR c++/95486 +// { dg-do compile { target c++20 } } + +template +struct X { X(U) requires __is_same(U, int) {} }; + +template +using Y = X; + +Y y{1}; +Y z{'a'}; // { dg-error "failed|no match" }