[cfe-commits] r164392 - /cfe/trunk/lib/Analysis/BodyFarm.cpp

Ted Kremenek kremenek at apple.com
Fri Sep 21 10:54:36 PDT 2012


Author: kremenek
Date: Fri Sep 21 12:54:35 2012
New Revision: 164392

URL: http://llvm.org/viewvc/llvm-project?rev=164392&view=rev
Log:
Use helper method to create DeclRefExprs in BodyFarm, hopefully allevating
them being correctly constructed.

Modified:
    cfe/trunk/lib/Analysis/BodyFarm.cpp

Modified: cfe/trunk/lib/Analysis/BodyFarm.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/BodyFarm.cpp?rev=164392&r1=164391&r2=164392&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/BodyFarm.cpp (original)
+++ cfe/trunk/lib/Analysis/BodyFarm.cpp Fri Sep 21 12:54:35 2012
@@ -41,6 +41,31 @@
   return true;
 }
 
+namespace {
+class ASTMaker {
+public:
+  ASTMaker(ASTContext &C) : C(C) {}
+  
+  DeclRefExpr *makeDeclRefExpr(const VarDecl *D);
+  
+private:
+  ASTContext &C;
+};
+}
+
+DeclRefExpr *ASTMaker::makeDeclRefExpr(const VarDecl *D) {
+  DeclRefExpr *DR =
+    DeclRefExpr::Create(/* Ctx = */ C,
+                        /* QualifierLoc = */ NestedNameSpecifierLoc(),
+                        /* TemplateKWLoc = */ SourceLocation(),
+                        /* D = */ const_cast<VarDecl*>(D),
+                        /* isEnclosingLocal = */ false,
+                        /* NameLoc = */ SourceLocation(),
+                        /* T = */ D->getType(),
+                        /* VK = */ VK_LValue);
+  return DR;
+}
+
 //===----------------------------------------------------------------------===//
 // Creation functions for faux ASTs.
 //===----------------------------------------------------------------------===//
@@ -79,11 +104,10 @@
   //  }
   // }
   
+  ASTMaker M(C);
+  
   // (1) Create the call.
-  DeclRefExpr *DR = DeclRefExpr::CreateEmpty(C, false, false, false, false);
-  DR->setDecl(const_cast<ParmVarDecl*>(Block));
-  DR->setType(Ty);
-  DR->setValueKind(VK_LValue);
+  DeclRefExpr *DR = M.makeDeclRefExpr(Block);
   ImplicitCastExpr *ICE = ImplicitCastExpr::Create(C, Ty, CK_LValueToRValue,
                                                    DR, 0, VK_RValue);
   CallExpr *CE = new (C) CallExpr(C, ICE, ArrayRef<Expr*>(), C.VoidTy,
@@ -95,10 +119,7 @@
                            C.IntTy, SourceLocation());
   ICE = ImplicitCastExpr::Create(C, PredicateTy, CK_IntegralCast, IL, 0,
                                  VK_RValue);
-  DR = DeclRefExpr::CreateEmpty(C, false, false, false, false);
-  DR->setDecl(const_cast<ParmVarDecl*>(Predicate));
-  DR->setType(PredicateQPtrTy);
-  DR->setValueKind(VK_LValue);
+  DR = M.makeDeclRefExpr(Predicate);
   ImplicitCastExpr *LValToRval =
     ImplicitCastExpr::Create(C, PredicateQPtrTy, CK_LValueToRValue, DR,
                              0, VK_RValue);
@@ -117,10 +138,7 @@
                                           SourceLocation());
   
   // (4) Create the 'if' condition.
-  DR = DeclRefExpr::CreateEmpty(C, false, false, false, false);
-  DR->setDecl(const_cast<ParmVarDecl*>(Predicate));
-  DR->setType(PredicateQPtrTy);
-  DR->setValueKind(VK_LValue);
+  DR = M.makeDeclRefExpr(Predicate);
   LValToRval = ImplicitCastExpr::Create(C, PredicateQPtrTy, CK_LValueToRValue,
                                         DR, 0, VK_RValue);
   UO = new (C) UnaryOperator(LValToRval, UO_Deref, PredicateTy,
@@ -136,8 +154,6 @@
   return If;
 }
 
-  
-
 /// Create a fake body for dispatch_sync.
 static Stmt *create_dispatch_sync(ASTContext &C, const FunctionDecl *D) {
   // Check if we have at least two parameters.
@@ -149,18 +165,16 @@
   QualType Ty = PV->getType();
   if (!isDispatchBlock(Ty))
     return 0;
-
+  
   // Everything checks out.  Create a fake body that just calls the block.
   // This is basically just an AST dump of:
   //
   // void dispatch_sync(dispatch_queue_t queue, void (^block)(void)) {
   //   block();
   // }
-  //
-  DeclRefExpr *DR = DeclRefExpr::CreateEmpty(C, false, false, false, false);
-  DR->setDecl(const_cast<ParmVarDecl*>(PV));
-  DR->setType(Ty);
-  DR->setValueKind(VK_LValue);
+  //  
+  ASTMaker M(C);
+  DeclRefExpr *DR = M.makeDeclRefExpr(PV);
   ImplicitCastExpr *ICE = ImplicitCastExpr::Create(C, Ty, CK_LValueToRValue,
                                                    DR, 0, VK_RValue);
   CallExpr *CE = new (C) CallExpr(C, ICE, ArrayRef<Expr*>(), C.VoidTy,





More information about the cfe-commits mailing list