]> granicus.if.org Git - clang/commitdiff
BugReporter (extensive diagnostics): Recursively adjust the referred expression
authorTed Kremenek <kremenek@apple.com>
Thu, 23 Apr 2009 16:44:22 +0000 (16:44 +0000)
committerTed Kremenek <kremenek@apple.com>
Thu, 23 Apr 2009 16:44:22 +0000 (16:44 +0000)
when popping location contexts.

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

lib/Analysis/BugReporter.cpp

index e0b1b6540f109cc99f0905ef2b8b782f502dcfee..b64182e2f355f8ee69093ac32375c469c66f3e6b 100644 (file)
@@ -790,18 +790,22 @@ class VISIBILITY_HIDDEN EdgeBuilder {
     PathDiagnosticLocation L = CLocs.back();
     if (L.asLocation().isFileID()) {
       
-      if (const Stmt *S = L.asStmt()) {        
-        // Adjust the location for some expressions that are best referenced
-        // by one of their subexpressions.
-        if (const ConditionalOperator *CO = dyn_cast<ConditionalOperator>(S))
-          S = CO->getCond();
-        else if (const ChooseExpr *CE = dyn_cast<ChooseExpr>(S))
-          S = CE->getCond();
-        
-        // Ignore parentheses.
-        if (const ParenExpr *PE = dyn_cast<ParenExpr>(S))
-          S = PE->IgnoreParens();
-        
+      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());        
       }