diff options
author | Björn Gustavsson <[email protected]> | 2014-03-05 12:53:39 +0100 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2014-03-05 12:53:39 +0100 |
commit | 17b1f6083bdde11909bb26bd24f6364b34d9694a (patch) | |
tree | ae35e4c2d76098585373e24e6995151707b581a0 /lib/compiler | |
parent | f4346705566f668b5cf88b91c5c79cec215a6ad6 (diff) | |
parent | d5fc107d5ae384bfb7b7ea1a10291b75d821c666 (diff) | |
download | otp-17b1f6083bdde11909bb26bd24f6364b34d9694a.tar.gz otp-17b1f6083bdde11909bb26bd24f6364b34d9694a.tar.bz2 otp-17b1f6083bdde11909bb26bd24f6364b34d9694a.zip |
Merge branch 'nox/compiler/beam_bool-bad-protected'
* nox/compiler/beam_bool-bad-protected:
Properly detect nonboolean protected expressions in beam_bool
Diffstat (limited to 'lib/compiler')
-rw-r--r-- | lib/compiler/src/beam_bool.erl | 12 | ||||
-rw-r--r-- | lib/compiler/test/guard_SUITE.erl | 8 |
2 files changed, 14 insertions, 6 deletions
diff --git a/lib/compiler/src/beam_bool.erl b/lib/compiler/src/beam_bool.erl index 590665514b..81b6d78864 100644 --- a/lib/compiler/src/beam_bool.erl +++ b/lib/compiler/src/beam_bool.erl @@ -393,10 +393,14 @@ bopt_tree([{set,_,_,{bif,'xor',_}}|_], _, _) -> throw('xor'); bopt_tree([{protected,[Dst],Code,_}|Is], Forest0, Pre) -> ProtForest0 = gb_trees:from_orddict([P || {_,any}=P <- gb_trees:to_list(Forest0)]), - {ProtPre,[{_,ProtTree}]} = bopt_tree(Code, ProtForest0, []), - Prot = {prot,ProtPre,ProtTree}, - Forest = gb_trees:enter(Dst, Prot, Forest0), - bopt_tree(Is, Forest, Pre); + case bopt_tree(Code, ProtForest0, []) of + {ProtPre,[{_,ProtTree}]} -> + Prot = {prot,ProtPre,ProtTree}, + Forest = gb_trees:enter(Dst, Prot, Forest0), + bopt_tree(Is, Forest, Pre); + _Res -> + throw(not_boolean_expr) + end; bopt_tree([{set,[Dst],[Src],move}=Move|Is], Forest, Pre) -> case {Src,Dst} of {{tmp,_},_} -> throw(move); diff --git a/lib/compiler/test/guard_SUITE.erl b/lib/compiler/test/guard_SUITE.erl index 2d9e8d1ac0..eb205d09a7 100644 --- a/lib/compiler/test/guard_SUITE.erl +++ b/lib/compiler/test/guard_SUITE.erl @@ -33,7 +33,7 @@ tricky/1,rel_ops/1,literal_type_tests/1, basic_andalso_orelse/1,traverse_dcd/1, check_qlc_hrl/1,andalso_semi/1,t_tuple_size/1,binary_part/1, - bad_constants/1]). + bad_constants/1,bad_guards/1]). suite() -> [{ct_hooks,[ts_install_cth]}]. @@ -50,7 +50,7 @@ groups() -> t_is_boolean,is_function_2,tricky,rel_ops, literal_type_tests,basic_andalso_orelse,traverse_dcd, check_qlc_hrl,andalso_semi,t_tuple_size,binary_part, - bad_constants]}]. + bad_constants,bad_guards]}]. init_per_suite(Config) -> Config. @@ -1554,6 +1554,10 @@ bad_constants(Config) when is_list(Config) -> ?line ?FAILING(3.14), ok. +bad_guards(Config) when is_list(Config) -> + if erlang:float(self()); true -> ok end, + ok. + %% Call this function to turn off constant propagation. id(I) -> I. |