[llvm-branch-commits] [cfe-branch] r71500 - /cfe/branches/Apple/Dib/lib/Analysis/BugReporter.cpp

Mike Stump mrs at apple.com
Mon May 11 16:21:41 PDT 2009


Author: mrs
Date: Mon May 11 18:21:40 2009
New Revision: 71500

URL: http://llvm.org/viewvc/llvm-project?rev=71500&view=rev
Log:
Merge in 71470:

BugReporter (extensive diagnostics): Add EdgeBuilder::cleanUpLocation for canonicalization locations and use this in both popLocation and rawAddEdge.

Modified:
    cfe/branches/Apple/Dib/lib/Analysis/BugReporter.cpp

Modified: cfe/branches/Apple/Dib/lib/Analysis/BugReporter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/Apple/Dib/lib/Analysis/BugReporter.cpp?rev=71500&r1=71499&r2=71500&view=diff

==============================================================================
--- cfe/branches/Apple/Dib/lib/Analysis/BugReporter.cpp (original)
+++ cfe/branches/Apple/Dib/lib/Analysis/BugReporter.cpp Mon May 11 18:21:40 2009
@@ -214,7 +214,7 @@
   SourceManager &SMgr = getSourceManager();
     
   while (isa<Expr>(S) && P.isConsumedExpr(cast<Expr>(S))) {
-    const Stmt *Parent = P.getParent(S);
+    const Stmt *Parent = P.getParentIgnoreParens(S);
     
     if (!Parent)
       break;
@@ -225,8 +225,7 @@
         if (B->isLogicalOp())
           return PathDiagnosticLocation(S, SMgr);
         break;
-      }
-        
+      }        
       case Stmt::CompoundStmtClass:
       case Stmt::StmtExprClass:
         return PathDiagnosticLocation(S, SMgr);
@@ -778,28 +777,32 @@
   
   PathDiagnosticLocation getContextLocation(const PathDiagnosticLocation &L);
   
+  PathDiagnosticLocation cleanUpLocation(const PathDiagnosticLocation &L) {
+    if (const Stmt *S = L.asStmt()) {
+      while (1) {
+        // Adjust the location for some expressions that are best referenced
+        // by one of their subexpressions.
+        if (const ParenExpr *PE = dyn_cast<ParenExpr>(S))
+          S = PE->IgnoreParens();
+        else if (const ConditionalOperator *CO = dyn_cast<ConditionalOperator>(S))
+          S = CO->getCond();
+        else if (const ChooseExpr *CE = dyn_cast<ChooseExpr>(S))
+          S = CE->getCond();
+        else if (const BinaryOperator *BE = dyn_cast<BinaryOperator>(S))
+          S = BE->getLHS();
+        else
+          break;
+      }
+      
+      return PathDiagnosticLocation(S, L.getManager());
+    }
+    
+    return L;
+  }
+  
   void popLocation() {
     if (!CLocs.back().isDead() && CLocs.back().asLocation().isFileID()) {
-      PathDiagnosticLocation L = CLocs.back();
-      
-      if (const Stmt *S = L.asStmt()) {
-        while (1) {
-          // Adjust the location for some expressions that are best referenced
-          // by one of their subexpressions.
-          if (const ParenExpr *PE = dyn_cast<ParenExpr>(S))
-            S = PE->IgnoreParens();
-          else if (const ConditionalOperator *CO = dyn_cast<ConditionalOperator>(S))
-            S = CO->getCond();
-          else if (const ChooseExpr *CE = dyn_cast<ChooseExpr>(S))
-            S = CE->getCond();
-          else if (const BinaryOperator *BE = dyn_cast<BinaryOperator>(S))
-            S = BE->getLHS();
-          else
-            break;
-        }
-
-        L = PathDiagnosticLocation(S, L.getManager());        
-      }      
+      PathDiagnosticLocation L = cleanUpLocation(CLocs.back());
       
       // For contexts, we only one the first character as the range.
       L = PathDiagnosticLocation(L.asLocation(), L.getManager());      
@@ -926,16 +929,19 @@
     return;
   }
   
-  if (NewLoc.asLocation() == PrevLoc.asLocation())
+  const PathDiagnosticLocation &NewLocClean = cleanUpLocation(NewLoc);
+  const PathDiagnosticLocation &PrevLocClean = cleanUpLocation(PrevLoc);
+  
+  if (NewLocClean.asLocation() == PrevLocClean.asLocation())
     return;
     
   // FIXME: Ignore intra-macro edges for now.
-  if (NewLoc.asLocation().getInstantiationLoc() ==
-      PrevLoc.asLocation().getInstantiationLoc())
+  if (NewLocClean.asLocation().getInstantiationLoc() ==
+      PrevLocClean.asLocation().getInstantiationLoc())
     return;
 
-  PD.push_front(new PathDiagnosticControlFlowPiece(NewLoc, PrevLoc));
-  PrevLoc = NewLoc;  
+  PD.push_front(new PathDiagnosticControlFlowPiece(NewLocClean, PrevLocClean));
+  PrevLoc = NewLoc;
 }
 
 void EdgeBuilder::addEdge(PathDiagnosticLocation NewLoc, bool alwaysAdd) {





More information about the llvm-branch-commits mailing list