]> granicus.if.org Git - clang/commitdiff
Allow us to transform pack expansion expressions.
authorDouglas Gregor <dgregor@apple.com>
Thu, 13 Jan 2011 00:19:55 +0000 (00:19 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 13 Jan 2011 00:19:55 +0000 (00:19 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123349 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/TreeTransform.h
test/CXX/temp/temp.decls/temp.variadic/injected-class-name.cpp

index f601d5c047c004ad3f607306246d43fbb3e6ef9c..43d89e2875ef5e7499bf4b7f3bb308ed80392b97 100644 (file)
@@ -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>
index 36621ecf5aecc68600202e6489238703e8adff21..a76ef8067dfd5ab407862f76826cc53456395ecd 100644 (file)
@@ -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;
 }