From: Douglas Gregor Date: Thu, 13 Jan 2011 00:19:55 +0000 (+0000) Subject: Allow us to transform pack expansion expressions. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4f1d282d6f32a419e89ddb56342e2313b0c78bb7;p=clang Allow us to transform pack expansion expressions. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123349 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index f601d5c047..43d89e2875 100644 --- a/lib/Sema/TreeTransform.h +++ b/lib/Sema/TreeTransform.h @@ -6787,8 +6787,14 @@ TreeTransform::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { template ExprResult TreeTransform::TransformPackExpansionExpr(PackExpansionExpr *E) { - llvm_unreachable("pack expansion expression in unhandled context"); - return ExprError(); + ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); + if (Pattern.isInvalid()) + return ExprError(); + + if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) + return SemaRef.Owned(E); + + return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc()); } template diff --git a/test/CXX/temp/temp.decls/temp.variadic/injected-class-name.cpp b/test/CXX/temp/temp.decls/temp.variadic/injected-class-name.cpp index 36621ecf5a..a76ef8067d 100644 --- a/test/CXX/temp/temp.decls/temp.variadic/injected-class-name.cpp +++ b/test/CXX/temp/temp.decls/temp.variadic/injected-class-name.cpp @@ -56,4 +56,20 @@ namespace rdar8848837 { X xif; + template struct unsigned_c { }; + template int g(ArgTypes...); + + template struct X1; + + template + struct X1 { + unsigned_c f(); + }; + + template + unsigned_c X1::f() { + return unsigned_c(); + } + + X1 xif2; }