Author: epilk Date: Tue Jul 5 12:57:24 2016 New Revision: 274566 URL: http://llvm.org/viewvc/llvm-project?rev=274566&view=rev Log: [Sema] Fix a bug where pack expansion was not expanded in type alias
The problem is that the parameter pack in a function type type alias is not reexpanded after being transformed. Also remove an incorrect comment in a similar function. Fixes PR26017. Differential Revision: http://reviews.llvm.org/D21030 Modified: cfe/trunk/lib/Sema/TreeTransform.h cfe/trunk/test/CXX/temp/temp.decls/temp.variadic/p5.cpp Modified: cfe/trunk/lib/Sema/TreeTransform.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=274566&r1=274565&r2=274566&view=diff ============================================================================== --- cfe/trunk/lib/Sema/TreeTransform.h (original) +++ cfe/trunk/lib/Sema/TreeTransform.h Tue Jul 5 12:57:24 2016 @@ -3327,8 +3327,6 @@ bool TreeTransform<Derived>::TransformEx 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>::TransformFu 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); Modified: cfe/trunk/test/CXX/temp/temp.decls/temp.variadic/p5.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/temp/temp.decls/temp.variadic/p5.cpp?rev=274566&r1=274565&r2=274566&view=diff ============================================================================== --- cfe/trunk/test/CXX/temp/temp.decls/temp.variadic/p5.cpp (original) +++ cfe/trunk/test/CXX/temp/temp.decls/temp.variadic/p5.cpp Tue Jul 5 12:57:24 2016 @@ -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); +} +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits