diff options
author | Zhongxing Xu <xuzhongxing@gmail.com> | 2010-03-23 07:32:14 +0000 |
---|---|---|
committer | Zhongxing Xu <xuzhongxing@gmail.com> | 2010-03-23 07:32:14 +0000 |
commit | 1ff3dcef1ff46c3fae68b6ad717797ae107f8683 (patch) | |
tree | fde48436adddbdb8db20464be00f246cfa146e4f /clang/lib/Checker/AggExprVisitor.cpp | |
parent | 9b680e21c05374aa2bff28c292da85f80b88ed5b (diff) | |
download | bcm5719-llvm-1ff3dcef1ff46c3fae68b6ad717797ae107f8683.tar.gz bcm5719-llvm-1ff3dcef1ff46c3fae68b6ad717797ae107f8683.zip |
Add a AggExprVisitor class. It contains lots of boiler
plate code for evaluating expressions of C++ class type.
llvm-svn: 99267
Diffstat (limited to 'clang/lib/Checker/AggExprVisitor.cpp')
-rw-r--r-- | clang/lib/Checker/AggExprVisitor.cpp | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/clang/lib/Checker/AggExprVisitor.cpp b/clang/lib/Checker/AggExprVisitor.cpp new file mode 100644 index 00000000000..5f55ab869c2 --- /dev/null +++ b/clang/lib/Checker/AggExprVisitor.cpp @@ -0,0 +1,54 @@ +//=-- AggExprVisitor.cpp - evaluating expressions of C++ class type -*- C++ -*-= +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines AggExprVisitor class, which contains lots of boiler +// plate code for evaluating expressions of C++ class type. +// +//===----------------------------------------------------------------------===// + +#include "clang/Checker/PathSensitive/GRExprEngine.h" +#include "clang/AST/StmtVisitor.h" + +using namespace clang; + +namespace { +class AggExprVisitor : public StmtVisitor<AggExprVisitor> { + SVal DestPtr; + ExplodedNode *Pred; + ExplodedNodeSet &DstSet; + GRExprEngine &Eng; + +public: + AggExprVisitor(SVal dest, ExplodedNode *N, ExplodedNodeSet &dst, + GRExprEngine &eng) + : DestPtr(dest), Pred(N), DstSet(dst), Eng(eng) {} + + void VisitCastExpr(CastExpr *E); + void VisitCXXConstructExpr(CXXConstructExpr *E); +}; +} + +void AggExprVisitor::VisitCastExpr(CastExpr *E) { + switch (E->getCastKind()) { + default: + assert(0 && "Unhandled cast kind"); + case CastExpr::CK_ConstructorConversion: + Visit(E->getSubExpr()); + break; + } +} + +void AggExprVisitor::VisitCXXConstructExpr(CXXConstructExpr *E) { + Eng.VisitCXXConstructExpr(E, DestPtr, Pred, DstSet); +} + +void GRExprEngine::VisitAggExpr(const Expr *E, SVal Dest, ExplodedNode *Pred, + ExplodedNodeSet &Dst) { + AggExprVisitor(Dest, Pred, Dst, *this).Visit(const_cast<Expr *>(E)); +} |