Skip to content

Commit

Permalink
[-Wunreachable-code] Handle 'return' with no argument dominated by 'n…
Browse files Browse the repository at this point in the history
…oreturn' function.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203333 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
tkremenek committed Mar 8, 2014
1 parent dee928e commit 42bbd73
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 6 deletions.
17 changes: 11 additions & 6 deletions lib/Analysis/ReachableCode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -132,10 +132,8 @@ static bool isTrivialExpression(const Expr *Ex) {

static bool isTrivialReturnOrDoWhile(const CFGBlock *B, const Stmt *S) {
const Expr *Ex = dyn_cast<Expr>(S);
if (!Ex)
return false;

if (!isTrivialExpression(Ex))
if (Ex && !isTrivialExpression(Ex))
return false;

// Check if the block ends with a do...while() and see if 'S' is the
Expand All @@ -152,13 +150,20 @@ static bool isTrivialReturnOrDoWhile(const CFGBlock *B, const Stmt *S) {
// Look to see if the block ends with a 'return', and see if 'S'
// is a substatement. The 'return' may not be the last element in
// the block because of destructors.
assert(!B->empty());
for (CFGBlock::const_reverse_iterator I = B->rbegin(), E = B->rend();
I != E; ++I) {
if (Optional<CFGStmt> CS = I->getAs<CFGStmt>()) {
if (const ReturnStmt *RS = dyn_cast<ReturnStmt>(CS->getStmt())) {
const Expr *RE = RS->getRetValue();
if (RE && stripExprSugar(RE->IgnoreParenCasts()) == Ex)
bool LookAtBody = false;
if (RS == S)
LookAtBody = true;
else {
const Expr *RE = RS->getRetValue();
if (RE && stripExprSugar(RE->IgnoreParenCasts()) == Ex)
LookAtBody = true;
}

if (LookAtBody)
return bodyEndsWithNoReturn(*B->pred_begin());
}
break;
Expand Down
5 changes: 5 additions & 0 deletions test/Sema/warn-unreachable.c
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,11 @@ int trivial_dead_return() {
return ((0)); // no-warning
}

void trivial_dead_return_void() {
raze();
return; // no-warning
}

MyEnum trival_dead_return_enum() {
raze();
return Value1; // no-warning
Expand Down

0 comments on commit 42bbd73

Please sign in to comment.