diff options
| -rw-r--r-- | clang/lib/Sema/TreeTransform.h | 10 | ||||
| -rw-r--r-- | clang/test/CXX/temp/temp.decls/temp.variadic/p5.cpp | 32 | 
2 files changed, 40 insertions, 2 deletions
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index b13dc34377d..88acc20600a 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -3327,8 +3327,6 @@ bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,          if (Out.isInvalid())            return true; -        // FIXME: Can this happen? We should not try to expand the pack -        // in this case.          if (Out.get()->containsUnexpandedParameterPack()) {            Out = getDerived().RebuildPackExpansion(                Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); @@ -4822,6 +4820,14 @@ bool TreeTransform<Derived>::TransformFunctionTypeParams(            if (NewType.isNull())              return true; +          if (NewType->containsUnexpandedParameterPack()) { +            NewType = +                getSema().getASTContext().getPackExpansionType(NewType, None); + +            if (NewType.isNull()) +              return true; +          } +            if (ParamInfos)              PInfos.set(OutParamTypes.size(), ParamInfos[i]);            OutParamTypes.push_back(NewType); diff --git a/clang/test/CXX/temp/temp.decls/temp.variadic/p5.cpp b/clang/test/CXX/temp/temp.decls/temp.variadic/p5.cpp index 4f9368f6b60..206e9f73e9f 100644 --- a/clang/test/CXX/temp/temp.decls/temp.variadic/p5.cpp +++ b/clang/test/CXX/temp/temp.decls/temp.variadic/p5.cpp @@ -437,3 +437,35 @@ namespace PR21289 {    template void g<>();    template void g<1, 2, 3>();  } + +template <class... Ts> +int var_expr(Ts... ts); + +template <class... Ts> +auto a_function(Ts... ts) -> decltype(var_expr(ts...)); + +template <class T> +using partial = decltype(a_function<int, T>); + +int use_partial() { partial<char> n; } + +namespace PR26017 { +template <class T> +struct Foo {}; +template <class... Ts> +using FooAlias = Foo<void(Ts...)>; + +template <class... Ts> +using FooAliasAlias = FooAlias<Ts..., Ts...>; + +template <class... Ts> +void bar(const FooAlias<Ts...> &) {} + +int fn() { +  FooAlias<> a; +  bar(a); + +  FooAlias<int> b; +  bar(b); +} +}  | 

