From 71141b1bd537cc516e485c834c2d36abba3f4544 Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Wed, 29 Jul 2020 22:06:41 -0400 Subject: [PATCH] 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. --- gcc/cp/pt.c | 5 ++++- gcc/testsuite/g++.dg/cpp2a/class-deduction-alias3.C | 11 +++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp2a/class-deduction-alias3.C diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 15be7b6d972..a7ab2bd2887 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -28620,7 +28620,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" }