]> granicus.if.org Git - clang/commitdiff
Text PathDiagnosticBuilder::getEnclosingStmt() about '?'
authorTed Kremenek <kremenek@apple.com>
Sat, 28 Mar 2009 04:08:14 +0000 (04:08 +0000)
committerTed Kremenek <kremenek@apple.com>
Sat, 28 Mar 2009 04:08:14 +0000 (04:08 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67909 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/BugReporter.cpp

index be666706414a91940f4210b4ff82e69ffeeae082..01a74ced223558b50767a41758994440522057e4 100644 (file)
@@ -157,7 +157,21 @@ PathDiagnosticBuilder::getEnclosingStmtLocation(const Stmt *S) {
     switch (Parent->getStmtClass()) {
       case Stmt::CompoundStmtClass:
       case Stmt::StmtExprClass:
-        return PathDiagnosticLocation(S, SMgr);               
+        return PathDiagnosticLocation(S, SMgr);
+      case Stmt::ChooseExprClass:
+        // Similar to '?' if we are referring to condition, just have the edge
+        // point to the entire choose expression.
+        if (cast<ChooseExpr>(Parent)->getCond() == S)
+          return PathDiagnosticLocation(Parent, SMgr);
+        else
+          return PathDiagnosticLocation(S, SMgr);                
+      case Stmt::ConditionalOperatorClass:
+        // For '?', if we are referring to condition, just have the edge point
+        // to the entire '?' expression.
+        if (cast<ConditionalOperator>(Parent)->getCond() == S)
+          return PathDiagnosticLocation(Parent, SMgr);
+        else
+          return PathDiagnosticLocation(S, SMgr);        
       case Stmt::DoStmtClass:
         if (cast<DoStmt>(Parent)->getCond() != S)
           return PathDiagnosticLocation(S, SMgr); 
@@ -914,7 +928,7 @@ void GRBugReporter::GeneratePathDiagnostic(PathDiagnostic& PD,
         case Stmt::ConditionalOperatorClass: {
           std::string sbuf;
           llvm::raw_string_ostream os(sbuf);
-          os << "'?' condition evaluates to ";
+          os << "'?' condition is ";
 
           if (*(Src->succ_begin()+1) == Dst)
             os << "false";
@@ -923,6 +937,9 @@ void GRBugReporter::GeneratePathDiagnostic(PathDiagnostic& PD,
           
           PathDiagnosticLocation End = PDB.ExecutionContinues(N);
           
+          if (const Stmt *S = End.asStmt())
+            End = PDB.getEnclosingStmtLocation(S);
+          
           PD.push_front(new PathDiagnosticControlFlowPiece(Start, End,
                                                            os.str()));
           break;