PR42362: Fix auto deduction of template parameter packs from

type-dependent argument packs.

We need to strip off the PackExpansionExpr to get the real (dependent)
type rather than an opaque DependentTy.

llvm-svn: 364165
This commit is contained in:
Richard Smith 2019-06-24 05:53:11 +00:00
parent 2fb6b0f2ba
commit 9771f500f2
2 changed files with 19 additions and 1 deletions

View File

@ -6323,9 +6323,12 @@ ExprResult Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param,
// the type is dependent, in order to check the types of non-type template
// arguments line up properly in partial ordering.
Optional<unsigned> Depth = Param->getDepth() + 1;
Expr *DeductionArg = Arg;
if (auto *PE = dyn_cast<PackExpansionExpr>(DeductionArg))
DeductionArg = PE->getPattern();
if (DeduceAutoType(
Context.getTrivialTypeSourceInfo(ParamType, Param->getLocation()),
Arg, ParamType, Depth) == DAR_Failed) {
DeductionArg, ParamType, Depth) == DAR_Failed) {
Diag(Arg->getExprLoc(),
diag::err_non_type_template_parm_type_deduction_failure)
<< Param->getDeclName() << Param->getType() << Arg->getType()

View File

@ -378,3 +378,18 @@ template <class T> struct M {
}
};
}
namespace PR42362 {
template<auto ...A> struct X { struct Y; void f(int...[A]); };
template<auto ...A> struct X<A...>::Y {};
template<auto ...A> void X<A...>::f(int...[A]) {}
void f() { X<1, 2>::Y y; X<1, 2>().f(0, 0); }
template<typename, auto...> struct Y;
template<auto ...A> struct Y<int, A...> {};
Y<int, 1, 2, 3> y;
template<auto (&...F)()> struct Z { struct Q; };
template<auto (&...F)()> struct Z<F...>::Q {};
Z<f, f, f>::Q q;
}