]> granicus.if.org Git - clang/commitdiff
When tree-transforming an expression sequence, always flag expanded
authorJohn McCall <rjmccall@apple.com>
Wed, 6 Jul 2011 07:30:07 +0000 (07:30 +0000)
committerJohn McCall <rjmccall@apple.com>
Wed, 6 Jul 2011 07:30:07 +0000 (07:30 +0000)
variadic argument pack expansions as having changed, rather than doing
it for each changed expansion, which leaves out zero-argument packs
with catastrophic consequences.

Fixes PR10260.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@134483 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/TreeTransform.h
test/CodeGenCXX/variadic-templates.cpp

index edbf1fb45900f72621ab17e383eb28f0fe8e74e4..66ea7df4ee79e7abc36238618d7cf7b92784a556 100644 (file)
@@ -1547,9 +1547,9 @@ public:
   /// By default, performs semantic analysis to build the new expression.
   /// Subclasses may override this routine to provide different behavior.
   ExprResult RebuildInitList(SourceLocation LBraceLoc,
-                                   MultiExprArg Inits,
-                                   SourceLocation RBraceLoc,
-                                   QualType ResultTy) {
+                             MultiExprArg Inits,
+                             SourceLocation RBraceLoc,
+                             QualType ResultTy) {
     ExprResult Result
       = SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
     if (Result.isInvalid() || ResultTy->isDependentType())
@@ -2476,6 +2476,10 @@ bool TreeTransform<Derived>::TransformExprs(Expr **Inputs,
         Outputs.push_back(Out.get());
         continue;
       }
+
+      // Record right away that the argument was changed.  This needs
+      // to happen even if the array expands to nothing.
+      if (ArgChanged) *ArgChanged = true;
       
       // The transform has determined that we should perform an elementwise
       // expansion of the pattern. Do so.
@@ -2492,8 +2496,6 @@ bool TreeTransform<Derived>::TransformExprs(Expr **Inputs,
             return true;
         }
         
-        if (ArgChanged)
-          *ArgChanged = true;  
         Outputs.push_back(Out.get());
       }
         
index 4f3cf1fe9db65b0c74b9a728355d9e9e5500db60..90c837067559d2e22341097a20ac225dbadb6db8 100644 (file)
@@ -9,4 +9,15 @@ int get_num_types(Types...) {
 // CHECK: ret i32 3
 template int get_num_types(int, float, double);
 
+// PR10260 - argument packs that expand to nothing
+namespace test1 {
+  template <class... T> void foo() {
+    int values[sizeof...(T)+1] = { T::value... };
+    // CHECK: define linkonce_odr void @_ZN5test13fooIJEEEvv()
+    // CHECK: alloca [1 x i32], align 4
+  }
 
+  void test() {
+    foo<>();
+  }
+}