[analyzer] Refactor: make PathDiagnosticLocation responsible for validation of SourceLocations (commit 2 of ?):
- Fix a fixme and move the logic of creating a PathDiagnosticLocation corresponding to a ProgramPoint into a PathDiagnosticLocation constructor.
- Rename PathDiagnosticLocation::create to differentiate from the added constructor.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@139825 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp b/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp
index 5dd5302..ed2a859 100644
--- a/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp
+++ b/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp
@@ -2144,13 +2144,13 @@
   llvm::tie(AllocNode, FirstBinding) =
     GetAllocationSite(BRC.getStateManager(), EndN, Sym);
 
-  SourceManager& SMgr = BRC.getSourceManager();
+  SourceManager& SM = BRC.getSourceManager();
 
   // Compute an actual location for the leak.  Sometimes a leak doesn't
   // occur at an actual statement (e.g., transition between blocks; end
   // of function) so we need to walk the graph and compute a real location.
   const ExplodedNode *LeakN = EndN;
-  PathDiagnosticLocation L = PathDiagnosticLocation::create(LeakN, SMgr);
+  PathDiagnosticLocation L = PathDiagnosticLocation::createEndOfPath(LeakN, SM);
 
   std::string sbuf;
   llvm::raw_string_ostream os(sbuf);
diff --git a/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp b/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
index c6fd63f..baef8cc 100644
--- a/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
+++ b/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
@@ -238,23 +238,11 @@
       return NULL;
   }
 
-  // FIXME: Refactor this into BugReporterContext.
-  const Stmt *S = 0;
-  ProgramPoint P = N->getLocation();
-
-  if (BlockEdge *BE = dyn_cast<BlockEdge>(&P)) {
-    const CFGBlock *BSrc = BE->getSrc();
-    S = BSrc->getTerminatorCondition();
-  }
-  else if (PostStmt *PS = dyn_cast<PostStmt>(&P)) {
-    S = PS->getStmt();
-  }
-
-  if (!S)
-    return NULL;
-
   // Construct a new PathDiagnosticPiece.
-  PathDiagnosticLocation L(S, BRC.getSourceManager(), P.getLocationContext());
+  ProgramPoint P = N->getLocation();
+  PathDiagnosticLocation L = PathDiagnosticLocation(P,BRC.getSourceManager());
+  if (!L.isValid())
+    return NULL;
   return new PathDiagnosticEventPiece(L, os.str());
 }
 
@@ -298,23 +286,11 @@
     if (os.str().empty())
       return NULL;
 
-    // FIXME: Refactor this into BugReporterContext.
-    const Stmt *S = 0;
-    ProgramPoint P = N->getLocation();
-
-    if (BlockEdge *BE = dyn_cast<BlockEdge>(&P)) {
-      const CFGBlock *BSrc = BE->getSrc();
-      S = BSrc->getTerminatorCondition();
-    }
-    else if (PostStmt *PS = dyn_cast<PostStmt>(&P)) {
-      S = PS->getStmt();
-    }
-
-    if (!S)
-      return NULL;
-
     // Construct a new PathDiagnosticPiece.
-    PathDiagnosticLocation L(S, BRC.getSourceManager(), P.getLocationContext());
+    ProgramPoint P = N->getLocation();
+    PathDiagnosticLocation L = PathDiagnosticLocation(P,BRC.getSourceManager());
+    if (!L.isValid())
+      return NULL;
     return new PathDiagnosticEventPiece(L, os.str());
   }
 
diff --git a/lib/StaticAnalyzer/Core/PathDiagnostic.cpp b/lib/StaticAnalyzer/Core/PathDiagnostic.cpp
index 8d53b2b..8dcb03b 100644
--- a/lib/StaticAnalyzer/Core/PathDiagnostic.cpp
+++ b/lib/StaticAnalyzer/Core/PathDiagnostic.cpp
@@ -130,7 +130,31 @@
 // PathDiagnosticLocation methods.
 //===----------------------------------------------------------------------===//
 
-PathDiagnosticLocation PathDiagnosticLocation::create(const ExplodedNode* N,
+PathDiagnosticLocation::PathDiagnosticLocation(const LocationContext *lc,
+                                               const SourceManager &sm)
+  : K(RangeK), S(0), D(0), SM(&sm), LC(lc) {
+  SourceLocation L = LC->getDecl()->getBodyRBrace();
+  R = SourceRange(L, L);
+}
+
+PathDiagnosticLocation::PathDiagnosticLocation(const ProgramPoint& P,
+                                               const SourceManager &SMng)
+  : K(StmtK), S(0), D(0), SM(&SMng), LC(P.getLocationContext()) {
+
+  if (const BlockEdge *BE = dyn_cast<BlockEdge>(&P)) {
+    const CFGBlock *BSrc = BE->getSrc();
+    S = BSrc->getTerminatorCondition();
+  }
+  else if (const PostStmt *PS = dyn_cast<PostStmt>(&P)) {
+    S = PS->getStmt();
+  }
+
+  if (!S)
+    invalidate();
+}
+
+PathDiagnosticLocation PathDiagnosticLocation::createEndOfPath(
+                                                      const ExplodedNode* N,
                                                       const SourceManager &SM) {
   assert(N && "Cannot create a location with a null node.");
 
@@ -150,8 +174,7 @@
     NI = NI->succ_empty() ? 0 : *(NI->succ_begin());
   }
 
-  const Decl &D = N->getCodeDecl();
-  return PathDiagnosticLocation(D.getBodyRBrace(), SM);
+  return PathDiagnosticLocation(N->getLocationContext(), SM);
 }
 
 static SourceLocation getValidSourceLocation(const Stmt* S,
@@ -188,10 +211,6 @@
       return FullSourceLoc(D->getLocation(), const_cast<SourceManager&>(*SM));
   }
 
-  if (!R.isValid())
-    return FullSourceLoc(LC->getDecl()->getBodyRBrace(),
-                         const_cast<SourceManager&>(*SM));
-
   return FullSourceLoc(R.getBegin(), const_cast<SourceManager&>(*SM));
 }