summaryrefslogtreecommitdiffstats
path: root/clang/lib/Analysis/BodyFarm.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2012-09-21 18:13:27 +0000
committerTed Kremenek <kremenek@apple.com>2012-09-21 18:13:27 +0000
commitca90ea5ed029d5464b703a60aff94b7a7528cf51 (patch)
tree1bb00050ddd5f81836f5dc55553b81a6ae513bba /clang/lib/Analysis/BodyFarm.cpp
parent69bcb82c59f61a867af3c0de73aa5779d2a6dd7d (diff)
downloadbcm5719-llvm-ca90ea5ed029d5464b703a60aff94b7a7528cf51.tar.gz
bcm5719-llvm-ca90ea5ed029d5464b703a60aff94b7a7528cf51.zip
Add helper method to BodyFarm for creating lvalue-to-rvalue conversions.
llvm-svn: 164397
Diffstat (limited to 'clang/lib/Analysis/BodyFarm.cpp')
-rw-r--r--clang/lib/Analysis/BodyFarm.cpp21
1 files changed, 12 insertions, 9 deletions
diff --git a/clang/lib/Analysis/BodyFarm.cpp b/clang/lib/Analysis/BodyFarm.cpp
index f7fbcc933dc..be8bf52d029 100644
--- a/clang/lib/Analysis/BodyFarm.cpp
+++ b/clang/lib/Analysis/BodyFarm.cpp
@@ -52,6 +52,9 @@ public:
/// Create an implicit cast for an integer conversion.
ImplicitCastExpr *makeIntegralCast(const Expr *Arg, QualType Ty);
+ // Create an implicit cast for lvalue-to-rvaluate conversions.
+ ImplicitCastExpr *makeLvalueToRvalue(const Expr *Arg, QualType Ty);
+
private:
ASTContext &C;
};
@@ -70,6 +73,11 @@ DeclRefExpr *ASTMaker::makeDeclRefExpr(const VarDecl *D) {
return DR;
}
+ImplicitCastExpr *ASTMaker::makeLvalueToRvalue(const Expr *Arg, QualType Ty) {
+ return ImplicitCastExpr::Create(C, Ty, CK_LValueToRValue,
+ const_cast<Expr*>(Arg), 0, VK_RValue);
+}
+
ImplicitCastExpr *ASTMaker::makeIntegralCast(const Expr *Arg, QualType Ty) {
return ImplicitCastExpr::Create(C, Ty, CK_IntegralCast,
const_cast<Expr*>(Arg), 0, VK_RValue);
@@ -117,8 +125,7 @@ static Stmt *create_dispatch_once(ASTContext &C, const FunctionDecl *D) {
// (1) Create the call.
DeclRefExpr *DR = M.makeDeclRefExpr(Block);
- ImplicitCastExpr *ICE = ImplicitCastExpr::Create(C, Ty, CK_LValueToRValue,
- DR, 0, VK_RValue);
+ ImplicitCastExpr *ICE = M.makeLvalueToRvalue(DR, Ty);
CallExpr *CE = new (C) CallExpr(C, ICE, ArrayRef<Expr*>(), C.VoidTy,
VK_RValue, SourceLocation());
@@ -128,9 +135,7 @@ static Stmt *create_dispatch_once(ASTContext &C, const FunctionDecl *D) {
C.IntTy, SourceLocation());
ICE = M.makeIntegralCast(IL, PredicateTy);
DR = M.makeDeclRefExpr(Predicate);
- ImplicitCastExpr *LValToRval =
- ImplicitCastExpr::Create(C, PredicateQPtrTy, CK_LValueToRValue, DR,
- 0, VK_RValue);
+ ImplicitCastExpr *LValToRval = M.makeLvalueToRvalue(DR, PredicateQPtrTy);
UnaryOperator *UO = new (C) UnaryOperator(LValToRval, UO_Deref, PredicateTy,
VK_LValue, OK_Ordinary,
SourceLocation());
@@ -147,13 +152,11 @@ static Stmt *create_dispatch_once(ASTContext &C, const FunctionDecl *D) {
// (4) Create the 'if' condition.
DR = M.makeDeclRefExpr(Predicate);
- LValToRval = ImplicitCastExpr::Create(C, PredicateQPtrTy, CK_LValueToRValue,
- DR, 0, VK_RValue);
+ LValToRval = M.makeLvalueToRvalue(DR, PredicateQPtrTy);
UO = new (C) UnaryOperator(LValToRval, UO_Deref, PredicateTy,
VK_LValue, OK_Ordinary,
SourceLocation());
- LValToRval = ImplicitCastExpr::Create(C, PredicateTy, CK_LValueToRValue,
- UO, 0, VK_RValue);
+ LValToRval = M.makeLvalueToRvalue(UO, PredicateTy);
UO = new (C) UnaryOperator(LValToRval, UO_LNot, C.IntTy,
VK_RValue, OK_Ordinary, SourceLocation());
OpenPOWER on IntegriCloud