]> granicus.if.org Git - clang/commitdiff
Modified StmtIterator to now include visiting the initialization expression for EnumC...
authorTed Kremenek <kremenek@apple.com>
Thu, 25 Oct 2007 22:24:19 +0000 (22:24 +0000)
committerTed Kremenek <kremenek@apple.com>
Thu, 25 Oct 2007 22:24:19 +0000 (22:24 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43366 91177308-0d34-0410-b5e6-96231b3b80d8

AST/StmtIterator.cpp
include/clang/AST/Decl.h
include/clang/AST/StmtIterator.h

index 2d198c029d949dcdb1dd4b29b2f0a528e94e3d4a..961ca50f2445726f5e8ca33231ed39012997934d 100644 (file)
 
 using namespace clang;
 
+static inline bool declHasExpr(ScopedDecl *decl) {
+  if (VarDecl* D = dyn_cast<VarDecl>(decl))
+    if (D->getInit())
+      return true;
+  
+  if (EnumConstantDecl* D = dyn_cast<EnumConstantDecl>(decl))
+    if (D->getInitExpr())
+      return true;
+  
+  return false;  
+}
+
 void StmtIteratorBase::NextDecl() {
   assert (FirstDecl && Ptr.D);
 
   do Ptr.D = Ptr.D->getNextDeclarator();
-  while (Ptr.D != NULL && !isa<VarDecl>(Ptr.D));
+  while (Ptr.D != NULL && !declHasExpr(Ptr.D));
   
   if (Ptr.D == NULL) FirstDecl = NULL;
 }
@@ -29,12 +41,8 @@ void StmtIteratorBase::NextDecl() {
 StmtIteratorBase::StmtIteratorBase(ScopedDecl* d) {
   assert (d);
   
-  while (d != NULL) {
-    if (VarDecl* V = dyn_cast<VarDecl>(d))
-      if (V->getInit()) break;
-    
+  while (d != NULL && !declHasExpr(d))
     d = d->getNextDeclarator();
-  }
   
   FirstDecl = d;
   Ptr.D = d;
@@ -61,6 +69,11 @@ void StmtIteratorBase::PrevDecl() {
   Ptr.D = lastVD;
 }
 
-Stmt*& StmtIteratorBase::GetInitializer() const {
-  return reinterpret_cast<Stmt*&>(cast<VarDecl>(Ptr.D)->Init);
+Stmt*& StmtIteratorBase::GetDeclExpr() const {
+  if (VarDecl* D = dyn_cast<VarDecl>(Ptr.D))
+    return reinterpret_cast<Stmt*&>(D->Init);
+  else {
+    EnumConstantDecl* D = cast<EnumConstantDecl>(Ptr.D);
+    return reinterpret_cast<Stmt*&>(D->Init);
+  }
 }
index 5788dc40f55b394d55f1a70093c240b609974c80..b8214a7120caa261f780ee314fd16320ab2572a5 100644 (file)
@@ -430,6 +430,8 @@ public:
   // Implement isa/cast/dyncast/etc.
   static bool classof(const Decl *D) { return D->getKind() == EnumConstant; }
   static bool classof(const EnumConstantDecl *D) { return true; }
+  
+  friend class StmtIteratorBase;
 };
 
 
index 3752793c9fd146c65da7b1c09bbd6df897baf94f..14c6aed3d49974c51e78ebf405fa709993c75150 100644 (file)
@@ -28,7 +28,7 @@ protected:
   
   void NextDecl();
   void PrevDecl();
-  Stmt*& GetInitializer() const;
+  Stmt*& GetDeclExpr() const;
 
   StmtIteratorBase(Stmt** s) : FirstDecl(NULL) { Ptr.S = s; }
   StmtIteratorBase(ScopedDecl* d);
@@ -84,7 +84,7 @@ public:
   }
   
   REFERENCE operator*() const { 
-    return (REFERENCE) (FirstDecl ? GetInitializer() : *Ptr.S);
+    return (REFERENCE) (FirstDecl ? GetDeclExpr() : *Ptr.S);
   }
   
   REFERENCE operator->() const { return operator*(); }