diff options
-rw-r--r-- | clang/lib/AST/StmtIterator.cpp | 9 | ||||
-rw-r--r-- | clang/test/Sema/vla.c | 8 |
2 files changed, 12 insertions, 5 deletions
diff --git a/clang/lib/AST/StmtIterator.cpp b/clang/lib/AST/StmtIterator.cpp index 14083e30a99..61b8e0f9c52 100644 --- a/clang/lib/AST/StmtIterator.cpp +++ b/clang/lib/AST/StmtIterator.cpp @@ -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); diff --git a/clang/test/Sema/vla.c b/clang/test/Sema/vla.c index c1e0e20e63a..fcb533adbcd 100644 --- a/clang/test/Sema/vla.c +++ b/clang/test/Sema/vla.c @@ -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; +} + |