]> granicus.if.org Git - clang/commitdiff
[analyzer] Use more create methods in the PathDiagnostic, cleanup.
authorAnna Zaks <ganna@apple.com>
Tue, 20 Sep 2011 01:38:47 +0000 (01:38 +0000)
committerAnna Zaks <ganna@apple.com>
Tue, 20 Sep 2011 01:38:47 +0000 (01:38 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@140130 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h
lib/StaticAnalyzer/Core/BugReporter.cpp
lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
lib/StaticAnalyzer/Core/PathDiagnostic.cpp

index 0c21788723e4f57a3c7ed010171f76685d9c5755..1b16ec50a052e0208781a57079caa69a648b2f1e 100644 (file)
@@ -143,13 +143,18 @@ public:
                                                    const SourceManager &SM);
 
   /// Create a location corresponding to the given valid ExplodedNode.
-  PathDiagnosticLocation(const ProgramPoint& P, const SourceManager &SMng);
+  static PathDiagnosticLocation create(const ProgramPoint& P,
+                                       const SourceManager &SMng);
 
   /// Create a location corresponding to the next valid ExplodedNode as end
   /// of path location.
   static PathDiagnosticLocation createEndOfPath(const ExplodedNode* N,
                                                 const SourceManager &SM);
 
+  /// Convert the given location into a single kind location.
+  static PathDiagnosticLocation createSingleLocation(
+                                             const PathDiagnosticLocation &PDL);
+
   bool operator==(const PathDiagnosticLocation &X) const {
     return K == X.K && R == X.R && S == X.S && D == X.D && LC == X.LC;
   }
@@ -173,16 +178,6 @@ public:
     *this = PathDiagnosticLocation();
   }
 
-  /// Specify that the object represents a single location.
-  void setSingleLocKind() {
-    if (K == SingleLocK)
-      return;
-
-    SourceLocation L = asLocation();
-    K = SingleLocK;
-    R = SourceRange(L, L);
-  }
-
   void flatten();
 
   const SourceManager& getManager() const { assert(isValid()); return *SM; }
index a90e79118d47dd6462fc27c3fc315a11ee1bd4f4..043f5d2b813397d5c72634a5d577d1b0801f2a41 100644 (file)
@@ -881,7 +881,7 @@ class EdgeBuilder {
     }
 
     if (firstCharOnly)
-      L.setSingleLocKind();
+      L  = PathDiagnosticLocation::createSingleLocation(L);
 
     return L;
   }
index 3356ed4eac7d5f87e9898e832834bb18e4b4cb2c..0a38e79c3b29fbee6fafd018b8409e95f08535ba 100644 (file)
@@ -240,7 +240,8 @@ PathDiagnosticPiece *FindLastStoreBRVisitor::VisitNode(const ExplodedNode *N,
 
   // Construct a new PathDiagnosticPiece.
   ProgramPoint P = N->getLocation();
-  PathDiagnosticLocation L = PathDiagnosticLocation(P,BRC.getSourceManager());
+  PathDiagnosticLocation L =
+    PathDiagnosticLocation::create(P, BRC.getSourceManager());
   if (!L.isValid())
     return NULL;
   return new PathDiagnosticEventPiece(L, os.str());
@@ -288,7 +289,8 @@ TrackConstraintBRVisitor::VisitNode(const ExplodedNode *N,
 
     // Construct a new PathDiagnosticPiece.
     ProgramPoint P = N->getLocation();
-    PathDiagnosticLocation L = PathDiagnosticLocation(P,BRC.getSourceManager());
+    PathDiagnosticLocation L =
+      PathDiagnosticLocation::create(P, BRC.getSourceManager());
     if (!L.isValid())
       return NULL;
     return new PathDiagnosticEventPiece(L, os.str());
index 3c798e0facb2ccfe3bce8d43b0a0fc2a645a7a9a..1faace5464daa82ed8b8a75f89b0483cfc68557a 100644 (file)
@@ -156,6 +156,7 @@ PathDiagnosticLocation
   return PathDiagnosticLocation(getValidSourceLocation(S, LC), SM, SingleLocK);
 }
 
+
 PathDiagnosticLocation
   PathDiagnosticLocation::createOperatorLoc(const BinaryOperator *BO,
                                             const SourceManager &SM) {
@@ -192,15 +193,16 @@ PathDiagnosticLocation
 
 PathDiagnosticLocation
   PathDiagnosticLocation::createDeclEnd(const LocationContext *LC,
-                                             const SourceManager &SM) {
+                                        const SourceManager &SM) {
   SourceLocation L = LC->getDecl()->getBodyRBrace();
   return PathDiagnosticLocation(L, SM, SingleLocK);
 }
 
-PathDiagnosticLocation::PathDiagnosticLocation(const ProgramPoint& P,
-                                               const SourceManager &SMng)
-  : K(StmtK), S(0), D(0), SM(&SMng), LC(P.getLocationContext()) {
+PathDiagnosticLocation
+  PathDiagnosticLocation::create(const ProgramPoint& P,
+                                 const SourceManager &SMng) {
 
+  const Stmt* S = 0;
   if (const BlockEdge *BE = dyn_cast<BlockEdge>(&P)) {
     const CFGBlock *BSrc = BE->getSrc();
     S = BSrc->getTerminatorCondition();
@@ -209,8 +211,10 @@ PathDiagnosticLocation::PathDiagnosticLocation(const ProgramPoint& P,
     S = PS->getStmt();
   }
 
+  return PathDiagnosticLocation(S, SMng, P.getLocationContext());
+
   if (!S)
-    invalidate();
+    return PathDiagnosticLocation();
 }
 
 PathDiagnosticLocation
@@ -223,9 +227,8 @@ PathDiagnosticLocation
   while (NI) {
     ProgramPoint P = NI->getLocation();
     const LocationContext *LC = P.getLocationContext();
-    if (const StmtPoint *PS = dyn_cast<StmtPoint>(&P)) {
+    if (const StmtPoint *PS = dyn_cast<StmtPoint>(&P))
       return PathDiagnosticLocation(PS->getStmt(), SM, LC);
-    }
     else if (const BlockEdge *BE = dyn_cast<BlockEdge>(&P)) {
       const Stmt *Term = BE->getSrc()->getTerminator();
       assert(Term);
@@ -237,6 +240,12 @@ PathDiagnosticLocation
   return createDeclEnd(N->getLocationContext(), SM);
 }
 
+PathDiagnosticLocation PathDiagnosticLocation::createSingleLocation(
+                                           const PathDiagnosticLocation &PDL) {
+  FullSourceLoc L = PDL.asLocation();
+  return PathDiagnosticLocation(L, L.getManager(), SingleLocK);
+}
+
 FullSourceLoc PathDiagnosticLocation::asLocation() const {
   assert(isValid());
   // Note that we want a 'switch' here so that the compiler can warn us in