r203029 - [-Wunreachable-code] generalize pruning out warning on trivial returns.
David Blaikie
dblaikie at gmail.com
Wed Mar 5 16:15:58 PST 2014
On Wed, Mar 5, 2014 at 3:46 PM, Ted Kremenek <kremenek at apple.com> wrote:
> Author: kremenek
> Date: Wed Mar 5 17:46:07 2014
> New Revision: 203029
>
> URL: http://llvm.org/viewvc/llvm-project?rev=203029&view=rev
> Log:
> [-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.
>
> Modified:
> cfe/trunk/lib/Analysis/ReachableCode.cpp
> cfe/trunk/test/Sema/warn-unreachable.c
>
> Modified: cfe/trunk/lib/Analysis/ReachableCode.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/ReachableCode.cpp?rev=203029&r1=203028&r2=203029&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Analysis/ReachableCode.cpp (original)
> +++ cfe/trunk/lib/Analysis/ReachableCode.cpp Wed Mar 5 17:46:07 2014
> @@ -291,12 +291,12 @@ static bool isEnumConstant(const Expr *E
> }
>
> 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 @@ static bool isTrivialReturnPrecededByNoR
> if (!Ex)
> return false;
>
> - Ex = Ex->IgnoreParenCasts();
> -
> if (!isTrivialExpression(Ex))
> return false;
>
> @@ -319,14 +317,13 @@ static bool isTrivialReturnPrecededByNoR
> 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 @@ void DeadCodeScan::reportDeadCode(const
> return;
>
> // Suppress trivial 'return' statements that are dead.
> - if (isTrivialReturnPrecededByNoReturn(B, S))
> + if (isTrivialReturn(B, S))
> return;
>
> SourceRange R1, R2;
>
> Modified: cfe/trunk/test/Sema/warn-unreachable.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/warn-unreachable.c?rev=203029&r1=203028&r2=203029&view=diff
> ==============================================================================
> --- cfe/trunk/test/Sema/warn-unreachable.c (original)
> +++ cfe/trunk/test/Sema/warn-unreachable.c Wed Mar 5 17:46:07 2014
> @@ -204,6 +204,27 @@ MyEnum trival_dead_return_enum() {
> return Value1; // no-warning
> }
>
> +MyEnum trivial_dead_return_enum_2(int x) {
> + switch (x) {
> + case 1: return 1;
> + case 2: return 2;
> + case 3: return 3;
> + }
> +
> + return 2; // no-warning
Wow - was this return really considered 'dead' at some point? How/why?
That looks totally reachable...
> +}
> +
> +MyEnum nontrivial_dead_return_enum_2(int x) {
> + switch (x) {
> + case 1: return 1;
> + case 2: return 2;
> + case 3: return 3;
> + default: return 4;
> + }
> +
> + return calledFun(); // expected-warning {{will never be executed}}
Did this not warn previously?
I don't quite see how these two examples relate to your commit
message, though - perhaps I'm missing something.
> +}
> +
> // Test unreachable code depending on configuration values
> #define CONFIG_CONSTANT 1
> int test_config_constant(int x) {
> @@ -235,7 +256,7 @@ int sizeof_int() {
> return 2; // no-warning
> }
>
> -enum MyEnum {
> +enum MyEnum2 {
> ME_A = CONFIG_CONSTANT,
> ME_B = 1
> };
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list