Add StmtIterator support for DeclGroups.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@57271 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/StmtIterator.cpp b/lib/AST/StmtIterator.cpp
index 3af66b3..1b0e9d5 100644
--- a/lib/AST/StmtIterator.cpp
+++ b/lib/AST/StmtIterator.cpp
@@ -35,12 +35,21 @@
p = FindVA(p->getElementType().getTypePtr());
setVAPtr(p);
- if (!p && inDecl()) {
- if (VarDecl* VD = dyn_cast<VarDecl>(decl))
- if (VD->Init)
- return;
+ if (!p) {
+ if (inDecl()) {
+ if (VarDecl* VD = dyn_cast<VarDecl>(decl))
+ if (VD->Init)
+ return;
- NextDecl();
+ NextDecl();
+ }
+ else if (inDeclGroup()) {
+ if (VarDecl* VD = dyn_cast<VarDecl>(*DGI))
+ if (VD->Init)
+ return;
+
+ NextDecl();
+ }
} else if (inSizeOfTypeVA()) {
assert(!decl);
RawVAPtr = 0;
@@ -48,45 +57,56 @@
}
void StmtIteratorBase::NextDecl(bool ImmediateAdvance) {
- assert (inDecl());
assert (getVAPtr() == NULL);
- assert (decl);
- if (ImmediateAdvance) {
- decl = decl->getNextDeclarator();
+ if (inDecl()) {
+ assert (decl);
+
+ if (ImmediateAdvance)
+ decl = decl->getNextDeclarator();
+
+ for ( ; decl ; decl = decl->getNextDeclarator())
+ if (HandleDecl(decl))
+ return;
+ }
+ else {
+ assert (inDeclGroup());
+
+ if (ImmediateAdvance)
+ ++DGI;
+
+ for ( ; DGI != DGE; ++DGI)
+ if (HandleDecl(*DGI))
+ return;
+ }
- if (!decl) {
- RawVAPtr = 0;
- return;
+ RawVAPtr = 0;
+}
+
+bool StmtIteratorBase::HandleDecl(Decl* D) {
+
+ if (VarDecl* VD = dyn_cast<VarDecl>(D)) {
+ if (VariableArrayType* VAPtr = FindVA(VD->getType().getTypePtr())) {
+ setVAPtr(VAPtr);
+ return true;
}
- }
-
- for ( ; decl ; decl = decl->getNextDeclarator()) {
- if (VarDecl* VD = dyn_cast<VarDecl>(decl)) {
- if (VariableArrayType* VAPtr = FindVA(VD->getType().getTypePtr())) {
- setVAPtr(VAPtr);
- return;
- }
-
- if (VD->getInit())
- return;
- }
- else if (TypedefDecl* TD = dyn_cast<TypedefDecl>(decl)) {
- if (VariableArrayType* VAPtr =
- FindVA(TD->getUnderlyingType().getTypePtr())) {
- setVAPtr(VAPtr);
- return;
- }
- }
- else if (EnumConstantDecl* ECD = dyn_cast<EnumConstantDecl>(decl))
- if (ECD->getInitExpr())
- return;
+
+ if (VD->getInit())
+ return true;
}
-
- if (!decl) {
- RawVAPtr = 0;
- return;
+ else if (TypedefDecl* TD = dyn_cast<TypedefDecl>(D)) {
+ if (VariableArrayType* VAPtr =
+ FindVA(TD->getUnderlyingType().getTypePtr())) {
+ setVAPtr(VAPtr);
+ return true;
+ }
}
+ else if (EnumConstantDecl* ECD = dyn_cast<EnumConstantDecl>(D)) {
+ if (ECD->getInitExpr())
+ return true;
+ }
+
+ return false;
}
StmtIteratorBase::StmtIteratorBase(ScopedDecl* d)
@@ -95,16 +115,31 @@
NextDecl(false);
}
+StmtIteratorBase::StmtIteratorBase(Decl** dgi, Decl** dge)
+ : DGI(dgi), RawVAPtr(DeclGroupMode), DGE(dge) {
+ NextDecl(false);
+}
+
StmtIteratorBase::StmtIteratorBase(VariableArrayType* t)
-: decl(NULL), RawVAPtr(SizeOfTypeVAMode) {
+: decl(0), RawVAPtr(SizeOfTypeVAMode) {
RawVAPtr |= reinterpret_cast<uintptr_t>(t);
}
Stmt*& StmtIteratorBase::GetDeclExpr() const {
+
+ if (inDeclGroup()) {
+ VarDecl* VD = cast<VarDecl>(*DGI);
+ return VD->Init;
+ }
+
+ assert (inDecl() || inSizeOfTypeVA());
+
if (VariableArrayType* VAPtr = getVAPtr()) {
assert (VAPtr->SizeExpr);
return VAPtr->SizeExpr;
}
+
+ assert (inDecl());
if (VarDecl* VD = dyn_cast<VarDecl>(decl)) {
assert (VD->Init);