forked from OSchip/llvm-project
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:
parent
2fb6b0f2ba
commit
9771f500f2
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue