diff options
author | Björn Gustavsson <[email protected]> | 2016-05-24 12:36:17 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2016-05-25 16:41:26 +0200 |
commit | 27ec25fee753da60d36ce560ce34b9cef7dc8df7 (patch) | |
tree | 7ae6d03ccc66e77ec3ae736d29a9a2c5cad2314b /lib/compiler/test | |
parent | 2a4281cf29a1fc7cc8408d7c42b60f930888133a (diff) | |
download | otp-27ec25fee753da60d36ce560ce34b9cef7dc8df7.tar.gz otp-27ec25fee753da60d36ce560ce34b9cef7dc8df7.tar.bz2 otp-27ec25fee753da60d36ce560ce34b9cef7dc8df7.zip |
beam_expect: Correctly handle blocks with multiple allocs
A negative allocation could be calculated if a block had multiple
allocations. Make sure to process the block in the right order
so that the correct allocation is processed. Also add an assertion.
This bug was often not noticed because beam_type usually silently
recalculates the allocation amount in test_heap/2 instructions.
Diffstat (limited to 'lib/compiler/test')
-rw-r--r-- | lib/compiler/test/beam_except_SUITE.erl | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/lib/compiler/test/beam_except_SUITE.erl b/lib/compiler/test/beam_except_SUITE.erl index 8746e62fb9..47367d6eab 100644 --- a/lib/compiler/test/beam_except_SUITE.erl +++ b/lib/compiler/test/beam_except_SUITE.erl @@ -21,15 +21,18 @@ -export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, init_per_group/2,end_per_group/2, - coverage/1]). + multiple_allocs/1,coverage/1]). suite() -> [{ct_hooks,[ts_install_cth]}]. all() -> - [coverage]. + test_lib:recompile(?MODULE), + [{group,p}]. groups() -> - []. + [{p,[parallel], + [multiple_allocs, + coverage]}]. init_per_suite(Config) -> Config. @@ -43,6 +46,23 @@ init_per_group(_GroupName, Config) -> end_per_group(_GroupName, Config) -> Config. +multiple_allocs(_Config) -> + {'EXIT',{{badmatch,#{true:=[p]}},_}} = + (catch could(pda, 0.0, {false,true}, {p})), + {'EXIT',{function_clause,_}} = (catch place(lee)), + {'EXIT',{{badmatch,wanted},_}} = (catch conditions()), + + ok. + +could(Coupons = pda, Favorite = _pleasure = 0.0, {_, true}, {Presents}) -> + (0 = true) = #{true => [Presents]}. + +place(lee) -> + (pregnancy = presentations) = [hours | [purchase || _ <- 0]] + wine. + +conditions() -> + (talking = going) = storage + [large = wanted]. + coverage(_) -> File = {file,"fake.erl"}, ok = fc(a), |