blob: 3af66b30bf34e264370b398192f68daf706aef7d [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
Eli Friedmanb0c05542008-05-21 05:06:46 +000038 if (!p && inDecl()) {
Ted Kremenek771fe162007-10-29 21:38:03 +000039 if (VarDecl* VD = dyn_cast<VarDecl>(decl))
40 if (VD->Init)
41 return;
42
43 NextDecl();
Eli Friedmanb0c05542008-05-21 05:06:46 +000044 } else if (inSizeOfTypeVA()) {
45 assert(!decl);
Ted Kremenek699e9fb2007-12-14 22:52:23 +000046 RawVAPtr = 0;
Eli Friedmanb0c05542008-05-21 05:06:46 +000047 }
Ted Kremenek92866e22007-10-29 20:50:16 +000048}
49
50void StmtIteratorBase::NextDecl(bool ImmediateAdvance) {
Ted Kremenekb51d2b22007-12-14 23:40:56 +000051 assert (inDecl());
Ted Kremenek92866e22007-10-29 20:50:16 +000052 assert (getVAPtr() == NULL);
53 assert (decl);
54
55 if (ImmediateAdvance) {
56 decl = decl->getNextDeclarator();
57
58 if (!decl) {
59 RawVAPtr = 0;
60 return;
61 }
62 }
63
64 for ( ; decl ; decl = decl->getNextDeclarator()) {
Ted Kremenek92866e22007-10-29 20:50:16 +000065 if (VarDecl* VD = dyn_cast<VarDecl>(decl)) {
66 if (VariableArrayType* VAPtr = FindVA(VD->getType().getTypePtr())) {
67 setVAPtr(VAPtr);
68 return;
69 }
70
71 if (VD->getInit())
72 return;
73 }
Ted Kremenek771fe162007-10-29 21:38:03 +000074 else if (TypedefDecl* TD = dyn_cast<TypedefDecl>(decl)) {
75 if (VariableArrayType* VAPtr =
76 FindVA(TD->getUnderlyingType().getTypePtr())) {
77 setVAPtr(VAPtr);
78 return;
79 }
80 }
Ted Kremenek92866e22007-10-29 20:50:16 +000081 else if (EnumConstantDecl* ECD = dyn_cast<EnumConstantDecl>(decl))
82 if (ECD->getInitExpr())
83 return;
84 }
Ted Kremenek103a1b42007-10-29 21:23:58 +000085
86 if (!decl) {
87 RawVAPtr = 0;
88 return;
89 }
Ted Kremenek92866e22007-10-29 20:50:16 +000090}
91
92StmtIteratorBase::StmtIteratorBase(ScopedDecl* d)
93 : decl(d), RawVAPtr(DeclMode) {
94 assert (decl);
95 NextDecl(false);
Ted Kremenekc7c326a2007-10-18 16:25:40 +000096}
Ted Kremenek9caf8b12007-10-18 00:24:38 +000097
Ted Kremenek699e9fb2007-12-14 22:52:23 +000098StmtIteratorBase::StmtIteratorBase(VariableArrayType* t)
Ted Kremenekb51d2b22007-12-14 23:40:56 +000099: decl(NULL), RawVAPtr(SizeOfTypeVAMode) {
Ted Kremenek699e9fb2007-12-14 22:52:23 +0000100 RawVAPtr |= reinterpret_cast<uintptr_t>(t);
101}
102
Ted Kremenekb990f182007-10-25 22:24:19 +0000103Stmt*& StmtIteratorBase::GetDeclExpr() const {
Ted Kremenek92866e22007-10-29 20:50:16 +0000104 if (VariableArrayType* VAPtr = getVAPtr()) {
105 assert (VAPtr->SizeExpr);
Ted Kremenekb3064042008-05-30 16:14:41 +0000106 return VAPtr->SizeExpr;
Ted Kremenekb990f182007-10-25 22:24:19 +0000107 }
Ted Kremenek92866e22007-10-29 20:50:16 +0000108
109 if (VarDecl* VD = dyn_cast<VarDecl>(decl)) {
110 assert (VD->Init);
Ted Kremenekb3064042008-05-30 16:14:41 +0000111 return VD->Init;
Ted Kremenek92866e22007-10-29 20:50:16 +0000112 }
113
114 EnumConstantDecl* ECD = cast<EnumConstantDecl>(decl);
Ted Kremenekb3064042008-05-30 16:14:41 +0000115 return ECD->Init;
Ted Kremenek9caf8b12007-10-18 00:24:38 +0000116}