blob: 00056e83af2c0a5c0027e7c3e025ef762fca3741 [file] [log] [blame]
Eugene Zelenko21fadad2017-11-21 23:26:08 +00001//===- StmtIterator.cpp - Iterators for Statements ------------------------===//
Ted Kremenek336886a2007-10-18 00:24:38 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-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 Kremenek336886a2007-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 Kremenek336886a2007-10-18 00:24:38 +000015#include "clang/AST/Decl.h"
Eugene Zelenko21fadad2017-11-21 23:26:08 +000016#include "clang/AST/Type.h"
17#include "clang/Basic/LLVM.h"
18#include "llvm/Support/Casting.h"
19#include <cassert>
20#include <cstdint>
Ted Kremenek336886a2007-10-18 00:24:38 +000021
22using namespace clang;
23
Douglas Gregor4619e432008-12-05 23:32:09 +000024// FIXME: Add support for dependent-sized array types in C++?
25// Does it even make sense to build a CFG for an uninstantiated template?
John McCall424cec92011-01-19 06:33:43 +000026static inline const VariableArrayType *FindVA(const Type* t) {
27 while (const ArrayType *vt = dyn_cast<ArrayType>(t)) {
28 if (const VariableArrayType *vat = dyn_cast<VariableArrayType>(vt))
Ted Kremenek2f70e712007-10-29 20:50:16 +000029 if (vat->getSizeExpr())
30 return vat;
Mike Stump11289f42009-09-09 15:08:12 +000031
Ted Kremenek2f70e712007-10-29 20:50:16 +000032 t = vt->getElementType().getTypePtr();
Ted Kremenek2ba761c2007-10-18 18:19:31 +000033 }
Mike Stump11289f42009-09-09 15:08:12 +000034
Craig Topper36250ad2014-05-12 05:36:57 +000035 return nullptr;
Ted Kremenek2f70e712007-10-29 20:50:16 +000036}
37
38void StmtIteratorBase::NextVA() {
Eugene Zelenko21fadad2017-11-21 23:26:08 +000039 assert(getVAPtr());
Ted Kremenek2f70e712007-10-29 20:50:16 +000040
John McCall424cec92011-01-19 06:33:43 +000041 const VariableArrayType *p = getVAPtr();
Ted Kremenek2f70e712007-10-29 20:50:16 +000042 p = FindVA(p->getElementType().getTypePtr());
43 setVAPtr(p);
44
Ted Kremenek587a44f2008-10-07 23:35:42 +000045 if (p)
46 return;
Mike Stump11289f42009-09-09 15:08:12 +000047
Eli Friedman2850ba82013-06-27 20:39:04 +000048 if (inDeclGroup()) {
Mike Stump11289f42009-09-09 15:08:12 +000049 if (VarDecl* VD = dyn_cast<VarDecl>(*DGI))
Chandler Carruth813faed2015-12-30 02:51:00 +000050 if (VD->hasInit())
Ted Kremenek587a44f2008-10-07 23:35:42 +000051 return;
Mike Stump11289f42009-09-09 15:08:12 +000052
53 NextDecl();
Ted Kremenek587a44f2008-10-07 23:35:42 +000054 }
55 else {
Eli Friedman2850ba82013-06-27 20:39:04 +000056 assert(inSizeOfTypeVA());
Ted Kremenek85e45f22007-12-14 22:52:23 +000057 RawVAPtr = 0;
Eli Friedman0883bfb2008-05-21 05:06:46 +000058 }
Ted Kremenek2f70e712007-10-29 20:50:16 +000059}
60
61void StmtIteratorBase::NextDecl(bool ImmediateAdvance) {
Craig Topper36250ad2014-05-12 05:36:57 +000062 assert(getVAPtr() == nullptr);
Eli Friedman2850ba82013-06-27 20:39:04 +000063 assert(inDeclGroup());
Mike Stump11289f42009-09-09 15:08:12 +000064
Eli Friedman2850ba82013-06-27 20:39:04 +000065 if (ImmediateAdvance)
66 ++DGI;
Mike Stump11289f42009-09-09 15:08:12 +000067
Eli Friedman2850ba82013-06-27 20:39:04 +000068 for ( ; DGI != DGE; ++DGI)
69 if (HandleDecl(*DGI))
Chris Lattner5bbb3c82009-03-29 16:50:03 +000070 return;
Ted Kremenek2f70e712007-10-29 20:50:16 +000071
Ted Kremenekf9638ba2008-10-07 23:04:14 +000072 RawVAPtr = 0;
73}
74
75bool StmtIteratorBase::HandleDecl(Decl* D) {
Mike Stump11289f42009-09-09 15:08:12 +000076 if (VarDecl* VD = dyn_cast<VarDecl>(D)) {
John McCall424cec92011-01-19 06:33:43 +000077 if (const VariableArrayType* VAPtr = FindVA(VD->getType().getTypePtr())) {
Ted Kremenekf9638ba2008-10-07 23:04:14 +000078 setVAPtr(VAPtr);
79 return true;
Ted Kremenek2f70e712007-10-29 20:50:16 +000080 }
Mike Stump11289f42009-09-09 15:08:12 +000081
Ted Kremenekf9638ba2008-10-07 23:04:14 +000082 if (VD->getInit())
83 return true;
Ted Kremenek2f70e712007-10-29 20:50:16 +000084 }
Richard Smithdda56e42011-04-15 14:24:37 +000085 else if (TypedefNameDecl* TD = dyn_cast<TypedefNameDecl>(D)) {
John McCall424cec92011-01-19 06:33:43 +000086 if (const VariableArrayType* VAPtr =
Ted Kremenekf9638ba2008-10-07 23:04:14 +000087 FindVA(TD->getUnderlyingType().getTypePtr())) {
88 setVAPtr(VAPtr);
89 return true;
90 }
Ted Kremenek899ef132007-10-29 21:23:58 +000091 }
Ted Kremenekf9638ba2008-10-07 23:04:14 +000092 else if (EnumConstantDecl* ECD = dyn_cast<EnumConstantDecl>(D)) {
93 if (ECD->getInitExpr())
94 return true;
95 }
96
Mike Stump11289f42009-09-09 15:08:12 +000097 return false;
Ted Kremenek2f70e712007-10-29 20:50:16 +000098}
99
Ted Kremenekf9638ba2008-10-07 23:04:14 +0000100StmtIteratorBase::StmtIteratorBase(Decl** dgi, Decl** dge)
Eugene Zelenko21fadad2017-11-21 23:26:08 +0000101 : DGI(dgi), RawVAPtr(DeclGroupMode), DGE(dge) {
Ted Kremenekf9638ba2008-10-07 23:04:14 +0000102 NextDecl(false);
103}
104
John McCall424cec92011-01-19 06:33:43 +0000105StmtIteratorBase::StmtIteratorBase(const VariableArrayType* t)
Eugene Zelenko21fadad2017-11-21 23:26:08 +0000106 : DGI(nullptr), RawVAPtr(SizeOfTypeVAMode) {
Ted Kremenek85e45f22007-12-14 22:52:23 +0000107 RawVAPtr |= reinterpret_cast<uintptr_t>(t);
108}
109
Ted Kremenek066f6032007-10-25 22:24:19 +0000110Stmt*& StmtIteratorBase::GetDeclExpr() const {
John McCall424cec92011-01-19 06:33:43 +0000111 if (const VariableArrayType* VAPtr = getVAPtr()) {
Eugene Zelenko21fadad2017-11-21 23:26:08 +0000112 assert(VAPtr->SizeExpr);
John McCall424cec92011-01-19 06:33:43 +0000113 return const_cast<Stmt*&>(VAPtr->SizeExpr);
Ted Kremenek066f6032007-10-25 22:24:19 +0000114 }
Ted Kremenekbe485b62009-03-11 18:17:16 +0000115
Eugene Zelenko21fadad2017-11-21 23:26:08 +0000116 assert(inDeclGroup());
Eli Friedman2850ba82013-06-27 20:39:04 +0000117 VarDecl* VD = cast<VarDecl>(*DGI);
118 return *VD->getInitAddress();
Ted Kremenek336886a2007-10-18 00:24:38 +0000119}