diff options
| author | Ted Kremenek <kremenek@apple.com> | 2009-11-25 01:33:13 +0000 | 
|---|---|---|
| committer | Ted Kremenek <kremenek@apple.com> | 2009-11-25 01:33:13 +0000 | 
| commit | cfe223f637abbf3541c66854c1f554004cc0f987 (patch) | |
| tree | 35cb3fd938eea7518c92ec388f7c21b7f8c98e50 /clang | |
| parent | 10a50e7371cef890f9448ab4e86cefa52a88fd16 (diff) | |
| download | bcm5719-llvm-cfe223f637abbf3541c66854c1f554004cc0f987.tar.gz bcm5719-llvm-cfe223f637abbf3541c66854c1f554004cc0f987.zip  | |
Add transfer function support for BlockExpr.
llvm-svn: 89829
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/include/clang/Analysis/PathSensitive/GRExprEngine.h | 3 | ||||
| -rw-r--r-- | clang/lib/Analysis/GRExprEngine.cpp | 12 | 
2 files changed, 15 insertions, 0 deletions
diff --git a/clang/include/clang/Analysis/PathSensitive/GRExprEngine.h b/clang/include/clang/Analysis/PathSensitive/GRExprEngine.h index 99ff57443b8..5c6475acf8e 100644 --- a/clang/include/clang/Analysis/PathSensitive/GRExprEngine.h +++ b/clang/include/clang/Analysis/PathSensitive/GRExprEngine.h @@ -255,6 +255,9 @@ protected:                                  AsmStmt::inputs_iterator I,                                  AsmStmt::inputs_iterator E,                                  ExplodedNode* Pred, ExplodedNodeSet& Dst); +   +  /// VisitBlockExpr - Transfer function logic for BlockExprs. +  void VisitBlockExpr(BlockExpr *BE, ExplodedNode *Pred, ExplodedNodeSet &Dst);    /// VisitBinaryOperator - Transfer function logic for binary operators.    void VisitBinaryOperator(BinaryOperator* B, ExplodedNode* Pred,  diff --git a/clang/lib/Analysis/GRExprEngine.cpp b/clang/lib/Analysis/GRExprEngine.cpp index 255a6639acf..11ea5f8f3f9 100644 --- a/clang/lib/Analysis/GRExprEngine.cpp +++ b/clang/lib/Analysis/GRExprEngine.cpp @@ -420,6 +420,10 @@ void GRExprEngine::Visit(Stmt* S, ExplodedNode* Pred, ExplodedNodeSet& Dst) {        VisitAsmStmt(cast<AsmStmt>(S), Pred, Dst);        break; +    case Stmt::BlockExprClass: +      VisitBlockExpr(cast<BlockExpr>(S), Pred, Dst); +      break; +      case Stmt::BinaryOperatorClass: {        BinaryOperator* B = cast<BinaryOperator>(S); @@ -1059,6 +1063,14 @@ void GRExprEngine::VisitLogicalExpr(BinaryOperator* B, ExplodedNode* Pred,  // Transfer functions: Loads and stores.  //===----------------------------------------------------------------------===// +void GRExprEngine::VisitBlockExpr(BlockExpr *BE, ExplodedNode *Pred, +                                  ExplodedNodeSet &Dst) { +  CanQualType T = getContext().getCanonicalType(BE->getType()); +  SVal V = ValMgr.getBlockPointer(BE->getBlockDecl(), T); +  MakeNode(Dst, BE, Pred, GetState(Pred)->BindExpr(BE, V), +           ProgramPoint::PostLValueKind); +} +  void GRExprEngine::VisitDeclRefExpr(DeclRefExpr *Ex, ExplodedNode *Pred,                                      ExplodedNodeSet &Dst, bool asLValue) {  | 

