diff options
author | Björn Gustavsson <[email protected]> | 2016-10-04 15:11:05 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2016-10-28 10:15:53 +0200 |
commit | e9c343d551779c975f075ae812ef8cd7ae0a1d64 (patch) | |
tree | 0a1c7d93bfe6006af0573a1044ec438b4177e267 /lib/compiler/src | |
parent | 97ee6664899949c5c40dfefa9d8b516ac639fb3c (diff) | |
download | otp-e9c343d551779c975f075ae812ef8cd7ae0a1d64.tar.gz otp-e9c343d551779c975f075ae812ef8cd7ae0a1d64.tar.bz2 otp-e9c343d551779c975f075ae812ef8cd7ae0a1d64.zip |
sys_core_fold: Eliminate complaint from core_lint
Diffstat (limited to 'lib/compiler/src')
-rw-r--r-- | lib/compiler/src/sys_core_fold.erl | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/lib/compiler/src/sys_core_fold.erl b/lib/compiler/src/sys_core_fold.erl index 44a6aa425d..7c233b323b 100644 --- a/lib/compiler/src/sys_core_fold.erl +++ b/lib/compiler/src/sys_core_fold.erl @@ -172,13 +172,23 @@ guard(Expr, Sub) -> %% opt_guard_try(#c_seq{arg=Arg,body=Body0}=Seq) -> Body = opt_guard_try(Body0), - case {Arg,Body} of - {#c_call{module=#c_literal{val=Mod}, - name=#c_literal{val=Name}, - args=Args},#c_literal{val=false}} -> + WillFail = case Body of + #c_call{module=#c_literal{val=erlang}, + name=#c_literal{val=error}, + args=[_]} -> + true; + #c_literal{val=false} -> + true; + _ -> + false + end, + case Arg of + #c_call{module=#c_literal{val=Mod}, + name=#c_literal{val=Name}, + args=Args} when WillFail -> %% We have sequence consisting of a call (evaluated %% for a possible exception and/or side effect only), - %% followed by 'false'. + %% followed by 'false' or a call to error/1. %% Since the sequence is inside a try block that will %% default to 'false' if any exception occurs, not %% evalutating the call will not change the behaviour @@ -193,7 +203,7 @@ opt_guard_try(#c_seq{arg=Arg,body=Body0}=Seq) -> %% be safely removed. Body end; - {_,_} -> + _ -> Seq#c_seq{body=Body} end; opt_guard_try(#c_case{clauses=Cs}=Term) -> |