[PATCH] D25321: Fix PR13910: Don't warn that __builtin_unreachable() is unreachable

David Blaikie via cfe-commits cfe-commits at lists.llvm.org
Thu Oct 6 07:50:40 PDT 2016


On Thu, Oct 6, 2016 at 6:16 AM Alex Lorenz <arphaman at gmail.com> wrote:

> arphaman created this revision.
> arphaman added reviewers: dblaikie, krememek.
> arphaman added a subscriber: cfe-commits.
> arphaman set the repository for this revision to rL LLVM.
>
> This patch fixes the issue of clang emitting an unreachable warning when
> it encounters unreachable `__builtin_unreachable()` statements. It detects
> references to `__builtin_unreachable` and doesn't emit an unreachable
> warning for them.
>
>
> Repository:
>   rL LLVM
>
> https://reviews.llvm.org/D25321
>
> Files:
>   lib/Analysis/ReachableCode.cpp
>   test/Sema/warn-unreachable.c
>
>
> Index: test/Sema/warn-unreachable.c
> ===================================================================
> --- test/Sema/warn-unreachable.c
> +++ test/Sema/warn-unreachable.c
> @@ -396,3 +396,40 @@
>    else
>      calledFun();
>  }
> +
> +int pr13910_foo(int x) {
> +  if (x == 1)
> +    return 0;
> +  else
> +    return x;
> +  __builtin_unreachable(); // expected no warning
> +}
> +
> +int pr13910_bar(int x) {
> +  switch (x) {
> +  default:
> +    return x + 1;
> +  }
> +  pr13910_foo(x); // expected-warning {{code will never be executed}}
> +}
> +
> +int pr13910_bar2(int x) {
> +  if (x == 1)
> +    return 0;
> +  else
> +    return x;
> +  pr13910_foo(x);          // expected-warning {{code will never be
> executed}}
> +  __builtin_unreachable(); // expected no warning
> +  pr13910_foo(x);          // expected-warning {{code will never be
> executed}}
>

Seems strange to have two warnings here ^ is that a separate bug?


> +}
> +
> +void pr13910_noreturn() {
> +  raze();
> +  __builtin_unreachable(); // expected no warning
> +}
> +
> +void pr13910_assert() {
> +  myassert(0 && "unreachable");
> +  return;
> +  __builtin_unreachable(); // expected no warning
> +}
> Index: lib/Analysis/ReachableCode.cpp
> ===================================================================
> --- lib/Analysis/ReachableCode.cpp
> +++ lib/Analysis/ReachableCode.cpp
> @@ -58,6 +58,15 @@
>    return false;
>  }
>
> +static bool isBuiltinUnreachable(const CFGBlock *B, const Stmt *S) {
> +  if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(S)) {
> +    const FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl());
> +    return FDecl && FDecl->getIdentifier() &&
> +           FDecl->getBuiltinID() == Builtin::BI__builtin_unreachable;
> +  }
> +  return false;
> +}
> +
>  static bool isDeadReturn(const CFGBlock *B, const Stmt *S) {
>    // Look to see if the current control flow ends with a 'return', and
> see if
>    // 'S' is a substatement. The 'return' may not be the last element in
> the
> @@ -574,8 +583,7 @@
>
>    if (isa<BreakStmt>(S)) {
>      UK = reachable_code::UK_Break;
> -  }
> -  else if (isTrivialDoWhile(B, S)) {
> +  } else if (isTrivialDoWhile(B, S) || isBuiltinUnreachable(B, S)) {
>      return;
>    }
>    else if (isDeadReturn(B, S)) {
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20161006/1a4beba9/attachment.html>


More information about the cfe-commits mailing list