diff options
| author | Douglas Gregor <dgregor@apple.com> | 2011-01-13 00:19:55 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2011-01-13 00:19:55 +0000 |
| commit | 0f836ea21381e42a59440d195670ed4a2a37a047 (patch) | |
| tree | d2ffeeaa6934c83d8f88628ac8c250ae719dffcc | |
| parent | fd4344b5a61c9279e16231f66ff2a135420a3e7b (diff) | |
| download | bcm5719-llvm-0f836ea21381e42a59440d195670ed4a2a37a047.tar.gz bcm5719-llvm-0f836ea21381e42a59440d195670ed4a2a37a047.zip | |
Allow us to transform pack expansion expressions.
llvm-svn: 123349
| -rw-r--r-- | clang/lib/Sema/TreeTransform.h | 10 | ||||
| -rw-r--r-- | clang/test/CXX/temp/temp.decls/temp.variadic/injected-class-name.cpp | 16 |
2 files changed, 24 insertions, 2 deletions
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index f601d5c047c..43d89e2875e 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -6787,8 +6787,14 @@ TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { template<typename Derived> ExprResult TreeTransform<Derived>::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<typename Derived> diff --git a/clang/test/CXX/temp/temp.decls/temp.variadic/injected-class-name.cpp b/clang/test/CXX/temp/temp.decls/temp.variadic/injected-class-name.cpp index 36621ecf5ae..a76ef8067df 100644 --- a/clang/test/CXX/temp/temp.decls/temp.variadic/injected-class-name.cpp +++ b/clang/test/CXX/temp/temp.decls/temp.variadic/injected-class-name.cpp @@ -56,4 +56,20 @@ namespace rdar8848837 { X<int(float, double)> xif; + template<unsigned> struct unsigned_c { }; + template<typename ...ArgTypes> int g(ArgTypes...); + + template<typename F> struct X1; + + template<typename R, typename ...ArgTypes> + struct X1<R(ArgTypes...)> { + unsigned_c<sizeof(1 + g(ArgTypes()...))> f(); + }; + + template<typename R, typename ...ArgTypes> + unsigned_c<sizeof(1 + g(ArgTypes()...))> X1<R(ArgTypes...)>::f() { + return unsigned_c<sizeof(int)>(); + } + + X1<int(float, double)> xif2; } |

