]> granicus.if.org Git - clang/commitdiff
BugReporter (extensive diagnostic algorithm): The initial control-flow edge now
authorTed Kremenek <kremenek@apple.com>
Wed, 22 Apr 2009 18:16:20 +0000 (18:16 +0000)
committerTed Kremenek <kremenek@apple.com>
Wed, 22 Apr 2009 18:16:20 +0000 (18:16 +0000)
starts from the first character of the first statement.

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

lib/Analysis/BugReporter.cpp

index 7e7132aaab70086204e089d9b244fdd01a55872a..33ff12d17eed795db59172096f53b8eb9f3df056 100644 (file)
@@ -796,8 +796,9 @@ class VISIBILITY_HIDDEN EdgeBuilder {
 public:
   EdgeBuilder(PathDiagnostic &pd, PathDiagnosticBuilder &pdb)
     : PD(pd), PDB(pdb) {
-      CLocs.push_back(PathDiagnosticLocation(&PDB.getCodeDecl(),
-                                             PDB.getSourceManager()));
+      
+      // If the PathDiagnostic already has pieces, add the enclosing statement
+      // of the first piece as a context as well.
       if (!PD.empty()) {
         PrevLoc = PD.begin()->getLocation();
         
@@ -808,6 +809,15 @@ public:
 
   ~EdgeBuilder() {
     while (!CLocs.empty()) popLocation();
+    
+    // Finally, add an initial edge from the start location of the first
+    // statement (if it doesn't already exist).
+    if (const CompoundStmt *CS = PDB.getCodeDecl().getBody(PDB.getContext()))
+      if (!CS->body_empty()) {
+        SourceLocation Loc = (*CS->body_begin())->getLocStart();
+        rawAddEdge(PathDiagnosticLocation(Loc, PDB.getSourceManager()));
+      }
+    
   }
 
   void addEdge(PathDiagnosticLocation NewLoc, bool alwaysAdd = false);
@@ -907,6 +917,10 @@ void EdgeBuilder::rawAddEdge(PathDiagnosticLocation NewLoc) {
 }
 
 void EdgeBuilder::addEdge(PathDiagnosticLocation NewLoc, bool alwaysAdd) {
+  
+  if (!alwaysAdd && NewLoc.asLocation().isMacroID())
+    return;
+  
   const PathDiagnosticLocation &CLoc = getContextLocation(NewLoc);
 
   while (!CLocs.empty()) {