]> granicus.if.org Git - clang/commitdiff
PR2347: Fix crash iterating over VLAs; this started triggering because
authorEli Friedman <eli.friedman@gmail.com>
Wed, 21 May 2008 05:06:46 +0000 (05:06 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Wed, 21 May 2008 05:06:46 +0000 (05:06 +0000)
we now iterate over the whole AST when we destroy it.

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

lib/AST/StmtIterator.cpp
test/Sema/vla.c

index 14083e30a992c72a9cb090766dc67fd0077aba18..61b8e0f9c52f7f35d1675f25729edee535b0e708 100644 (file)
@@ -36,16 +36,16 @@ void StmtIteratorBase::NextVA() {
   p = FindVA(p->getElementType().getTypePtr());
   setVAPtr(p);
 
-  if (!p && decl) {
+  if (!p && inDecl()) {
     if (VarDecl* VD = dyn_cast<VarDecl>(decl)) 
       if (VD->Init)
         return;
       
     NextDecl();
-  }
-  else {
+  } else if (inSizeOfTypeVA()) {
+    assert(!decl);
     RawVAPtr = 0;
-  }    
+  }
 }
 
 void StmtIteratorBase::NextDecl(bool ImmediateAdvance) {
@@ -101,7 +101,6 @@ StmtIteratorBase::StmtIteratorBase(VariableArrayType* t)
   RawVAPtr |= reinterpret_cast<uintptr_t>(t);
 }
 
-
 Stmt*& StmtIteratorBase::GetDeclExpr() const {
   if (VariableArrayType* VAPtr = getVAPtr()) {
     assert (VAPtr->SizeExpr);
index c1e0e20e63af43f0f912f8fa2660572950168fdf..fcb533adbcd7cc39c3e5959a19d51d2c294e0392 100644 (file)
@@ -5,3 +5,11 @@ int test1() {
   static int y = sizeof(x);  // expected-error {{not constant}}
 }
 
+// PR2347
+void f (unsigned int m)
+{
+  extern int e[2][m];
+
+  e[0][0] = 0;
+}
+