[-Wunreachable-code] generalize pruning out warning on trivial returns.
Previously we only pruned dead returns preceded by a call to a
'noreturn' function. After looking at the results of the LLVM codebase,
there are many others that should be pruned as well.
llvm-svn: 203029
diff --git a/clang/lib/Analysis/ReachableCode.cpp b/clang/lib/Analysis/ReachableCode.cpp
index b772145..7958840 100644
--- a/clang/lib/Analysis/ReachableCode.cpp
+++ b/clang/lib/Analysis/ReachableCode.cpp
@@ -291,12 +291,12 @@
}
static bool isTrivialExpression(const Expr *Ex) {
+ Ex = Ex->IgnoreParenCasts();
return isa<IntegerLiteral>(Ex) || isa<StringLiteral>(Ex) ||
isEnumConstant(Ex);
}
-static bool isTrivialReturnPrecededByNoReturn(const CFGBlock *B,
- const Stmt *S) {
+static bool isTrivialReturn(const CFGBlock *B, const Stmt *S) {
if (B->pred_empty())
return false;
@@ -304,8 +304,6 @@
if (!Ex)
return false;
- Ex = Ex->IgnoreParenCasts();
-
if (!isTrivialExpression(Ex))
return false;
@@ -319,14 +317,13 @@
if (const ReturnStmt *RS = dyn_cast<ReturnStmt>(CS->getStmt())) {
const Expr *RE = RS->getRetValue();
if (RE && RE->IgnoreParenCasts() == Ex)
- break;
+ return true;
}
- return false;
+ break;
}
}
- assert(B->pred_size() == 1);
- return bodyEndsWithNoReturn(*B->pred_begin());
+ return false;
}
void DeadCodeScan::reportDeadCode(const CFGBlock *B,
@@ -339,7 +336,7 @@
return;
// Suppress trivial 'return' statements that are dead.
- if (isTrivialReturnPrecededByNoReturn(B, S))
+ if (isTrivialReturn(B, S))
return;
SourceRange R1, R2;