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.
This commit is contained in:
parent
f31dd9beb9
commit
71141b1bd5
@ -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
|
||||
{
|
||||
|
11
gcc/testsuite/g++.dg/cpp2a/class-deduction-alias3.C
Normal file
11
gcc/testsuite/g++.dg/cpp2a/class-deduction-alias3.C
Normal file
@ -0,0 +1,11 @@
|
||||
// PR c++/95486
|
||||
// { dg-do compile { target c++20 } }
|
||||
|
||||
template<class T, class U>
|
||||
struct X { X(U) requires __is_same(U, int) {} };
|
||||
|
||||
template<class U>
|
||||
using Y = X<void, U>;
|
||||
|
||||
Y y{1};
|
||||
Y z{'a'}; // { dg-error "failed|no match" }
|
Loading…
Reference in New Issue
Block a user