On Thu, Oct 6, 2016 at 6:16 AM Alex Lorenz <arpha...@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)) { > > >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits