diff options
-rw-r--r-- | lib/Sema/SemaChecking.cpp | 19 | ||||
-rw-r--r-- | test/Sema/warn-unreachable.c | 4 | ||||
-rw-r--r-- | test/SemaCXX/warn-unreachable.cpp | 3 |
3 files changed, 22 insertions, 4 deletions
diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index 8fdb5ec87e..9fadd45fbb 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/lib/Sema/SemaChecking.cpp @@ -2067,8 +2067,12 @@ static unsigned MarkLive(CFGBlock *e, llvm::BitVector &live) { static SourceLocation GetUnreachableLoc(CFGBlock &b, SourceRange &R1, SourceRange &R2) { Stmt *S; - if (!b.empty()) - S = b[0].getStmt(); + unsigned sn = 0; + R1 = R2 = SourceRange(); + + top: + if (sn < b.size()) + S = b[sn].getStmt(); else if (b.getTerminator()) S = b.getTerminator(); else @@ -2078,8 +2082,8 @@ static SourceLocation GetUnreachableLoc(CFGBlock &b, SourceRange &R1, case Expr::BinaryOperatorClass: { BinaryOperator *BO = cast<BinaryOperator>(S); if (BO->getOpcode() == BinaryOperator::Comma) { - if (b.size() >= 2) - return b[1].getStmt()->getLocStart(); + if (sn+1 < b.size()) + return b[sn+1].getStmt()->getLocStart(); CFGBlock *n = &b; while (1) { if (n->getTerminator()) @@ -2108,6 +2112,13 @@ static SourceLocation GetUnreachableLoc(CFGBlock &b, SourceRange &R1, R2 = CAO->getRHS()->getSourceRange(); return CAO->getOperatorLoc(); } + case Expr::ConditionalOperatorClass: { + const ConditionalOperator *CO = cast<ConditionalOperator>(S); + return CO->getQuestionLoc(); + } + case Expr::ImplicitCastExprClass: + ++sn; + goto top; case Stmt::CXXTryStmtClass: { return cast<CXXTryStmt>(S)->getHandler(0)->getCatchLoc(); } diff --git a/test/Sema/warn-unreachable.c b/test/Sema/warn-unreachable.c index fc56a87286..7c913cafb2 100644 --- a/test/Sema/warn-unreachable.c +++ b/test/Sema/warn-unreachable.c @@ -83,5 +83,9 @@ void test2() { i += // expected-warning {{will never be executed}} halt(); + case 9: + halt() + ? // expected-warning {{will never be executed}} + dead() : dead(); } } diff --git a/test/SemaCXX/warn-unreachable.cpp b/test/SemaCXX/warn-unreachable.cpp index a1f0dabec3..852943f01d 100644 --- a/test/SemaCXX/warn-unreachable.cpp +++ b/test/SemaCXX/warn-unreachable.cpp @@ -39,4 +39,7 @@ void test2() { void test3() { halt() --; // expected-warning {{will never be executed}} + halt() + ? // expected-warning {{will never be executed}} + dead() : dead(); } |