]> granicus.if.org Git - clang/commitdiff
Enhance AnalysisDeclContext::getReferencedBlockVars() to understand PseudoObjExprs...
authorTed Kremenek <kremenek@apple.com>
Thu, 22 Dec 2011 01:30:46 +0000 (01:30 +0000)
committerTed Kremenek <kremenek@apple.com>
Thu, 22 Dec 2011 01:30:46 +0000 (01:30 +0000)
that the information collected by this method is a super set of the captured variables in BlockDecl.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@147122 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Analysis/AnalysisContext.h
lib/Analysis/AnalysisDeclContext.cpp
lib/Analysis/LiveVariables.cpp

index a204d83009f4f51e62ce227ef463d8078eb02136..f4ece34286d0e94794231db3ec0cb78821e2275a 100644 (file)
@@ -92,7 +92,6 @@ class AnalysisDeclContext {
 
   llvm::BumpPtrAllocator A;
 
-  // FIXME: remove.
   llvm::DenseMap<const BlockDecl*,void*> *ReferencedBlockVars;
 
   void *ManagedAnalyses;
index 546cf98f689b072223faf20b6d1e7e7f59fde05a..96a92b4b5bc90adf4ec20c62240a9db321211d59 100644 (file)
@@ -353,7 +353,7 @@ public:
         Visit(child);
   }
 
-  void VisitDeclRefExpr(const DeclRefExpr *DR) {
+  void VisitDeclRefExpr(DeclRefExpr *DR) {
     // Non-local variables are also directly modified.
     if (const VarDecl *VD = dyn_cast<VarDecl>(DR->getDecl()))
       if (!VD->hasLocalStorage()) {
@@ -381,6 +381,16 @@ public:
     IgnoredContexts.insert(BR->getBlockDecl());
     Visit(BR->getBlockDecl()->getBody());
   }
+  
+  void VisitPseudoObjectExpr(PseudoObjectExpr *PE) {
+    for (PseudoObjectExpr::semantics_iterator it = PE->semantics_begin(), 
+         et = PE->semantics_end(); it != et; ++it) {
+      Expr *Semantic = *it;
+      if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(Semantic))
+        Semantic = OVE->getSourceExpr();
+      Visit(Semantic);
+    }
+  }
 };
 } // end anonymous namespace
 
index 89cf9f8bbb622f867acf1e5870bbf0b2706bced7..ff6607d51aa94469bb3f2104a869900f5cd642bf 100644 (file)
@@ -354,10 +354,11 @@ void TransferFunctions::VisitBinaryOperator(BinaryOperator *B) {
 }
 
 void TransferFunctions::VisitBlockExpr(BlockExpr *BE) {
-  const BlockDecl *BD = BE->getBlockDecl();
-  for (BlockDecl::capture_const_iterator it = BD->capture_begin(),
-       ei = BD->capture_end(); it != ei; ++it) {
-    const VarDecl *VD = it->getVariable();
+  AnalysisDeclContext::referenced_decls_iterator I, E;
+  llvm::tie(I, E) =
+    LV.analysisContext.getReferencedBlockVars(BE->getBlockDecl());
+  for ( ; I != E ; ++I) {
+    const VarDecl *VD = *I;
     if (isAlwaysAlive(VD))
       continue;
     val.liveDecls = LV.DSetFact.add(val.liveDecls, VD);