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