Skip to content

Commit 270cec6

Browse files
authored
Merge pull request #9069 from bjorng/bjorn/compiler/zip-coverage
Fix code coverage for zip generators
2 parents cdd61f5 + 56240a8 commit 270cec6

File tree

3 files changed

+57
-8
lines changed

3 files changed

+57
-8
lines changed

lib/compiler/src/compile.erl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1671,6 +1671,7 @@ abstr_passes(AbstrStatus) ->
16711671
{delay,[{iff,debug_info,?pass(save_abstract_code)}]},
16721672

16731673
{delay,[{iff,line_coverage,{pass,sys_coverage}}]},
1674+
{iff,'dcover',{src_listing,"cover"}},
16741675

16751676
?pass(expand_records),
16761677
{iff,'dexp',{listing,"expand"}},

lib/compiler/src/sys_coverage.erl

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -574,18 +574,36 @@ munge_qs([{m_generate_strict,Anno,Pattern,Expr}|Qs], Vars0, MQs) ->
574574
{MExpr, Vars1} = munge_expr(Expr, Vars0),
575575
munge_qs1(Qs, A, {m_generate_strict,Anno,Pattern,MExpr}, Vars0, Vars1, MQs);
576576
munge_qs([{zip,Anno,Gs0}|Qs], Vars0, MQs) ->
577-
{Gs1, Vars1} = munge_qualifiers(Gs0, Vars0),
578-
%% Get rid of dummy filters inserted by munge_qualifiers/2 --
579-
%% they are not allowed in the zip construct.
580-
Gs = [G || G <- Gs1, element(1, G) =/= block],
581-
munge_qs1(Qs, Anno, {zip,Anno,Gs}, Vars0, Vars1, MQs);
577+
{Gs, Pre, Vars1} = munge_zip(Gs0, Vars0),
578+
munge_qs1(Qs, Anno, {zip,Anno,Gs}, Vars0, Vars1, Pre ++ MQs);
582579
munge_qs([Expr|Qs], Vars0, MQs) ->
583580
A = element(2, Expr),
584581
{MungedExpr, Vars1} = munge_expr(Expr, Vars0),
585582
munge_qs1(Qs, A, MungedExpr, Vars0, Vars1, MQs);
586583
munge_qs([], Vars0, MQs) ->
587584
{reverse(MQs), Vars0}.
588585

586+
munge_zip([G0|Gs0], Vars0) ->
587+
{Gen,Anno,Pattern,Expr} = G0,
588+
{MungedExpr, Vars1} = munge_expr(Expr, Vars0),
589+
G1 = {Gen,Anno,Pattern,MungedExpr},
590+
case munge_qs1([], Anno, G1, Vars0, Vars1, []) of
591+
{[{block,_,_}=Blk,G], Vars2} ->
592+
{Gs, Vars3} = munge_zip_1(Gs0, Vars2, [G]),
593+
{Gs, [Blk], Vars3};
594+
{[G], Vars2} ->
595+
{Gs, Vars3} = munge_zip_1(Gs0, Vars2, [G]),
596+
{Gs, [], Vars3}
597+
end.
598+
599+
munge_zip_1([G0|Gs], Vars0, Acc) ->
600+
{Gen,Anno,Pattern,Expr} = G0,
601+
{MungedExpr, Vars1} = munge_expr(Expr, Vars0),
602+
G1 = {Gen,Anno,Pattern,MungedExpr},
603+
munge_zip_1(Gs, Vars1, [G1|Acc]);
604+
munge_zip_1([], Vars, Acc) ->
605+
{reverse(Acc), Vars}.
606+
589607
munge_qs1(Qs, Anno, NQ, Vars0, Vars1, MQs) ->
590608
case new_bumps(Vars1, Vars0) of
591609
[_] ->

lib/compiler/test/zlc_SUITE.erl

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@
2424
init_per_testcase/2,end_per_testcase/2,
2525
basic/1,mixed_zlc/1,zmc/1,filter_guard/1,
2626
filter_pattern/1,cartesian/1,nomatch/1,bad_generators/1,
27-
strict_list/1,strict_binary/1]).
27+
strict_list/1,strict_binary/1,
28+
cover/1]).
2829

2930
-include_lib("common_test/include/ct.hrl").
3031
-include_lib("stdlib/include/assert.hrl").
@@ -47,7 +48,8 @@ groups() ->
4748
nomatch,
4849
bad_generators,
4950
strict_list,
50-
strict_binary
51+
strict_binary,
52+
cover
5153
]}].
5254

5355
init_per_suite(Config) ->
@@ -287,7 +289,7 @@ strict_list(Config) when is_list(Config) ->
287289
NaN = <<-1:64>>,
288290
[] = strict_list_5(<<>>, <<>>),
289291
[3.14] = strict_list_5(<<0:1,1:1>>, <<32,0.0:32/float, 64,3.14:64/float>>),
290-
[0.0,3.14] = strict_list_5(<<1:1,1:1>>, <<32,0.0:32/float, 64,3.14:64/float>>),
292+
[+0.0,3.14] = strict_list_5(<<1:1,1:1>>, <<32,0.0:32/float, 64,3.14:64/float>>),
291293
{'EXIT',{{bad_generators,{<<>>,<<64,42.0/float>>}},_}} =
292294
catch strict_list_5(<<>>, <<64,42.0/float>>),
293295
{'EXIT',{{bad_generators,{<<0:1,1:1>>,
@@ -440,6 +442,34 @@ bad_generators(Config) when is_list(Config) ->
440442
end,
441443
ok.
442444

445+
%% Cover some code in sys_coverage.
446+
cover(Config) when is_list(Config) ->
447+
[] = do_cover_1([], []),
448+
[11,12,13] = do_cover_1([1,2,3], [10,10,10]),
449+
450+
ok.
451+
452+
do_cover_1(L1, L2) ->
453+
Res = [A + B || A <- begin L1 end && B <- L2],
454+
Res = [A + B || A <-
455+
begin L1 end &&
456+
B <- L2],
457+
Res = [A + B ||
458+
A <-
459+
begin L1 end &&
460+
B <-
461+
begin L2 end],
462+
Res = [A + B ||
463+
A <-
464+
begin
465+
L1
466+
end &&
467+
B <-
468+
begin
469+
L2
470+
end],
471+
Res.
472+
443473
-file("bad_zlc.erl", 1).
444474
bad_generators(L1,L2) -> %Line 2
445475
[{I1, I2} || %Line 3

0 commit comments

Comments
 (0)