]> granicus.if.org Git - clang/commitdiff
For CFGAutomaticObjDtor, the type may be reference type, e.g., const A &c = A();
authorZhongxing Xu <xuzhongxing@gmail.com>
Thu, 25 Nov 2010 06:35:14 +0000 (06:35 +0000)
committerZhongxing Xu <xuzhongxing@gmail.com>
Thu, 25 Nov 2010 06:35:14 +0000 (06:35 +0000)
Also apply some new coding style.

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

lib/Checker/GRExprEngine.cpp

index 6db8dbab7d8ffd83240b361d6fb1b98927853931..4121144fad292e8acbdd946daddd20cef9bd91e9 100644 (file)
@@ -738,19 +738,26 @@ void GRExprEngine::ProcessImplicitDtor(const CFGImplicitDtor D,
   }
 }
 
-void GRExprEngine::ProcessAutomaticObjDtor(const CFGAutomaticObjDtor D,
+void GRExprEngine::ProcessAutomaticObjDtor(const CFGAutomaticObjDtor dtor,
                                            GRStmtNodeBuilder &builder) {
-  ExplodedNode *Pred = builder.getBasePredecessor();
-  const GRState *state = Pred->getState();
-  const VarDecl *VD = D.getVarDecl();
-  const CXXRecordDecl *CD = VD->getType()->getAsCXXRecordDecl();
-  const CXXDestructorDecl *DD = CD->getDestructor();
+  ExplodedNode *pred = builder.getBasePredecessor();
+  const GRState *state = pred->getState();
+  const VarDecl *varDecl = dtor.getVarDecl();
+
+  QualType varType = varDecl->getType();
+
+  if (const ReferenceType *refType = varType->getAs<ReferenceType>())
+    varType = refType->getPointeeType();
+
+  const CXXRecordDecl *recordDecl = varType->getAsCXXRecordDecl();
+  assert(recordDecl && "get CXXRecordDecl fail");
+  const CXXDestructorDecl *dtorDecl = recordDecl->getDestructor();
 
-  Loc Dest = state->getLValue(VD, Pred->getLocationContext());
+  Loc dest = state->getLValue(varDecl, pred->getLocationContext());
 
-  ExplodedNodeSet Dst;
-  VisitCXXDestructor(DD, cast<loc::MemRegionVal>(Dest).getRegion(),
-                     D.getTriggerStmt(), Pred, Dst);
+  ExplodedNodeSet dstSet;
+  VisitCXXDestructor(dtorDecl, cast<loc::MemRegionVal>(dest).getRegion(),
+                     dtor.getTriggerStmt(), pred, dstSet);
 }
 
 void GRExprEngine::ProcessBaseDtor(const CFGBaseDtor D,