summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/AST/StmtIterator.cpp9
-rw-r--r--clang/test/Sema/vla.c8
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;
+}
+
OpenPOWER on IntegriCloud