[-Wunreachable-code] Handle 'return' with no argument dominated by 'noreturn' function.
llvm-svn: 203333
This commit is contained in:
parent
53b8ea1c89
commit
04bfbeea04
|
@ -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
|
||||
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue