[cfe-commits] r71477 - /cfe/trunk/lib/Analysis/BugReporter.cpp

Ted Kremenek kremenek at apple.com
Mon May 11 14:42:35 PDT 2009


Author: kremenek
Date: Mon May 11 16:42:34 2009
New Revision: 71477

URL: http://llvm.org/viewvc/llvm-project?rev=71477&view=rev
Log:
EdgeBuilder::cleanUpLocation() should used the PathDiagnosticLocation constructor for a single point, not a range.

Modified:
    cfe/trunk/lib/Analysis/BugReporter.cpp

Modified: cfe/trunk/lib/Analysis/BugReporter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/BugReporter.cpp?rev=71477&r1=71476&r2=71477&view=diff

==============================================================================
--- cfe/trunk/lib/Analysis/BugReporter.cpp (original)
+++ cfe/trunk/lib/Analysis/BugReporter.cpp Mon May 11 16:42:34 2009
@@ -777,36 +777,51 @@
   
   PathDiagnosticLocation getContextLocation(const PathDiagnosticLocation &L);
   
-  PathDiagnosticLocation cleanUpLocation(const PathDiagnosticLocation &L) {
+  PathDiagnosticLocation cleanUpLocation(PathDiagnosticLocation L,
+                                         bool firstCharOnly = false) {
     if (const Stmt *S = L.asStmt()) {
+      const Stmt *Original = S;
       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;
+        switch (S->getStmtClass()) {
+          default:
+            break;
+          case Stmt::ParenExprClass:
+            S = cast<ParenExpr>(S)->IgnoreParens();
+            firstCharOnly = true;
+            continue;
+          case Stmt::ConditionalOperatorClass:
+            S = cast<ConditionalOperator>(S)->getCond();
+            firstCharOnly = true;
+            continue;
+          case Stmt::ChooseExprClass:
+            S = cast<ChooseExpr>(S)->getCond();
+            firstCharOnly = true;
+            continue;
+          case Stmt::BinaryOperatorClass:
+            S = cast<BinaryOperator>(S)->getLHS();
+            firstCharOnly = true;
+            continue;
+        }
+        
+        break;
       }
       
-      return PathDiagnosticLocation(S, L.getManager());
+      if (S != Original)
+        L = PathDiagnosticLocation(S, L.getManager());
     }
     
+    if (firstCharOnly)
+      L = PathDiagnosticLocation(L.asLocation());
+
     return L;
   }
   
   void popLocation() {
     if (!CLocs.back().isDead() && CLocs.back().asLocation().isFileID()) {
-      PathDiagnosticLocation L = cleanUpLocation(CLocs.back());
-      
       // For contexts, we only one the first character as the range.
-      L = PathDiagnosticLocation(L.asLocation(), L.getManager());      
-      rawAddEdge(L);
+      rawAddEdge( cleanUpLocation(CLocs.back(), true));
     }
     CLocs.pop_back();
   }





More information about the cfe-commits mailing list