blob: 1b0e9d57c06a303e52d26b9153358cedd55e9982 [file] [log] [blame]
Ted Kremenek9caf8b12007-10-18 00:24:38 +00001//===--- StmtIterator.cpp - Iterators for Statements ------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner0bc735f2007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Ted Kremenek9caf8b12007-10-18 00:24:38 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This file defines internal methods for StmtIterator.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/AST/StmtIterator.h"
Ted Kremenek9caf8b12007-10-18 00:24:38 +000015#include "clang/AST/Decl.h"
16
17using namespace clang;
18
Ted Kremenek92866e22007-10-29 20:50:16 +000019static inline VariableArrayType* FindVA(Type* t) {
20 while (ArrayType* vt = dyn_cast<ArrayType>(t)) {
21 if (VariableArrayType* vat = dyn_cast<VariableArrayType>(vt))
22 if (vat->getSizeExpr())
23 return vat;
24
25 t = vt->getElementType().getTypePtr();
Ted Kremenekc325e7f2007-10-18 18:19:31 +000026 }
27
Ted Kremenek92866e22007-10-29 20:50:16 +000028 return NULL;
29}
30
31void StmtIteratorBase::NextVA() {
32 assert (getVAPtr());
33
34 VariableArrayType* p = getVAPtr();
35 p = FindVA(p->getElementType().getTypePtr());
36 setVAPtr(p);
37
Ted Kremenek3e6d1202008-10-07 23:04:14 +000038 if (!p) {
39 if (inDecl()) {
40 if (VarDecl* VD = dyn_cast<VarDecl>(decl))
41 if (VD->Init)
42 return;
Ted Kremenek771fe162007-10-29 21:38:03 +000043
Ted Kremenek3e6d1202008-10-07 23:04:14 +000044 NextDecl();
45 }
46 else if (inDeclGroup()) {
47 if (VarDecl* VD = dyn_cast<VarDecl>(*DGI))
48 if (VD->Init)
49 return;
50
51 NextDecl();
52 }
Eli Friedmanb0c05542008-05-21 05:06:46 +000053 } else if (inSizeOfTypeVA()) {
54 assert(!decl);
Ted Kremenek699e9fb2007-12-14 22:52:23 +000055 RawVAPtr = 0;
Eli Friedmanb0c05542008-05-21 05:06:46 +000056 }
Ted Kremenek92866e22007-10-29 20:50:16 +000057}
58
59void StmtIteratorBase::NextDecl(bool ImmediateAdvance) {
Ted Kremenek92866e22007-10-29 20:50:16 +000060 assert (getVAPtr() == NULL);
Ted Kremenek92866e22007-10-29 20:50:16 +000061
Ted Kremenek3e6d1202008-10-07 23:04:14 +000062 if (inDecl()) {
63 assert (decl);
64
65 if (ImmediateAdvance)
66 decl = decl->getNextDeclarator();
67
68 for ( ; decl ; decl = decl->getNextDeclarator())
69 if (HandleDecl(decl))
70 return;
71 }
72 else {
73 assert (inDeclGroup());
74
75 if (ImmediateAdvance)
76 ++DGI;
77
78 for ( ; DGI != DGE; ++DGI)
79 if (HandleDecl(*DGI))
80 return;
81 }
Ted Kremenek92866e22007-10-29 20:50:16 +000082
Ted Kremenek3e6d1202008-10-07 23:04:14 +000083 RawVAPtr = 0;
84}
85
86bool StmtIteratorBase::HandleDecl(Decl* D) {
87
88 if (VarDecl* VD = dyn_cast<VarDecl>(D)) {
89 if (VariableArrayType* VAPtr = FindVA(VD->getType().getTypePtr())) {
90 setVAPtr(VAPtr);
91 return true;
Ted Kremenek92866e22007-10-29 20:50:16 +000092 }
Ted Kremenek3e6d1202008-10-07 23:04:14 +000093
94 if (VD->getInit())
95 return true;
Ted Kremenek92866e22007-10-29 20:50:16 +000096 }
Ted Kremenek3e6d1202008-10-07 23:04:14 +000097 else if (TypedefDecl* TD = dyn_cast<TypedefDecl>(D)) {
98 if (VariableArrayType* VAPtr =
99 FindVA(TD->getUnderlyingType().getTypePtr())) {
100 setVAPtr(VAPtr);
101 return true;
102 }
Ted Kremenek103a1b42007-10-29 21:23:58 +0000103 }
Ted Kremenek3e6d1202008-10-07 23:04:14 +0000104 else if (EnumConstantDecl* ECD = dyn_cast<EnumConstantDecl>(D)) {
105 if (ECD->getInitExpr())
106 return true;
107 }
108
109 return false;
Ted Kremenek92866e22007-10-29 20:50:16 +0000110}
111
112StmtIteratorBase::StmtIteratorBase(ScopedDecl* d)
113 : decl(d), RawVAPtr(DeclMode) {
114 assert (decl);
115 NextDecl(false);
Ted Kremenekc7c326a2007-10-18 16:25:40 +0000116}
Ted Kremenek9caf8b12007-10-18 00:24:38 +0000117
Ted Kremenek3e6d1202008-10-07 23:04:14 +0000118StmtIteratorBase::StmtIteratorBase(Decl** dgi, Decl** dge)
119 : DGI(dgi), RawVAPtr(DeclGroupMode), DGE(dge) {
120 NextDecl(false);
121}
122
Ted Kremenek699e9fb2007-12-14 22:52:23 +0000123StmtIteratorBase::StmtIteratorBase(VariableArrayType* t)
Ted Kremenek3e6d1202008-10-07 23:04:14 +0000124: decl(0), RawVAPtr(SizeOfTypeVAMode) {
Ted Kremenek699e9fb2007-12-14 22:52:23 +0000125 RawVAPtr |= reinterpret_cast<uintptr_t>(t);
126}
127
Ted Kremenekb990f182007-10-25 22:24:19 +0000128Stmt*& StmtIteratorBase::GetDeclExpr() const {
Ted Kremenek3e6d1202008-10-07 23:04:14 +0000129
130 if (inDeclGroup()) {
131 VarDecl* VD = cast<VarDecl>(*DGI);
132 return VD->Init;
133 }
134
135 assert (inDecl() || inSizeOfTypeVA());
136
Ted Kremenek92866e22007-10-29 20:50:16 +0000137 if (VariableArrayType* VAPtr = getVAPtr()) {
138 assert (VAPtr->SizeExpr);
Ted Kremenekb3064042008-05-30 16:14:41 +0000139 return VAPtr->SizeExpr;
Ted Kremenekb990f182007-10-25 22:24:19 +0000140 }
Ted Kremenek3e6d1202008-10-07 23:04:14 +0000141
142 assert (inDecl());
Ted Kremenek92866e22007-10-29 20:50:16 +0000143
144 if (VarDecl* VD = dyn_cast<VarDecl>(decl)) {
145 assert (VD->Init);
Ted Kremenekb3064042008-05-30 16:14:41 +0000146 return VD->Init;
Ted Kremenek92866e22007-10-29 20:50:16 +0000147 }
148
149 EnumConstantDecl* ECD = cast<EnumConstantDecl>(decl);
Ted Kremenekb3064042008-05-30 16:14:41 +0000150 return ECD->Init;
Ted Kremenek9caf8b12007-10-18 00:24:38 +0000151}