summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorBjörn Gustavsson <bjorn@erlang.org>2020-02-17 15:21:25 +0100
committerBjörn Gustavsson <bjorn@erlang.org>2020-02-17 15:53:41 +0100
commit8faaa4927551200e37113a2abd1c0f7ca3d88be2 (patch)
tree297e8da3800f50a6ed2365e482cfb1062646e518 /lib
parent146ac36a11345f7f23832920110b250139cff1ab (diff)
downloaderlang-8faaa4927551200e37113a2abd1c0f7ca3d88be2.tar.gz
cover: Suppress compilation warnings when instrumenting andalso/orelse
The cover tool translates andalso/orelse to a case in the instrumented code. For example: both_ok(A, B) -> A =:= ok andalso B =:= ok. Is translated to: both_ok(A, B) -> case A =:= ok of true -> B =:= ok; false -> false; _1 -> error({badarg, _1}) end. Since the expression `A =:= ok` clearly is a boolean expression, the final clause can't possibly match, so the compiler issues a warning. If the `warnings_as_errors` option is set in the environment or in the module itself, compilation will fail. Eliminate the warning by letting cover mark the final clause as compiler generated to suppress the warning. https://bugs.erlang.org/browse/ERL-1147
Diffstat (limited to 'lib')
-rw-r--r--lib/tools/src/cover.erl5
-rw-r--r--lib/tools/test/cover_SUITE.erl13
-rw-r--r--lib/tools/test/cover_SUITE_data/otp_16476/obvious_booleans.erl17
3 files changed, 33 insertions, 2 deletions
diff --git a/lib/tools/src/cover.erl b/lib/tools/src/cover.erl
index 2b3af417b6..80af13a4c3 100644
--- a/lib/tools/src/cover.erl
+++ b/lib/tools/src/cover.erl
@@ -1722,7 +1722,10 @@ bool_switch(E, T, F, AllVars, AuxVarN) ->
{'case',Line,E,
[{clause,Line,[{atom,Line,true}],[],[T]},
{clause,Line,[{atom,Line,false}],[],[F]},
- {clause,Line,[AuxVar],[],
+ %% Mark the next clause as compiler-generated to suppress
+ %% a warning if the case expression is an obvious boolean
+ %% value.
+ {clause,erl_anno:set_generated(true, Line),[AuxVar],[],
[{call,Line,
{remote,Line,{atom,Line,erlang},{atom,Line,error}},
[{tuple,Line,[{atom,Line,badarg},AuxVar]}]}]}]}.
diff --git a/lib/tools/test/cover_SUITE.erl b/lib/tools/test/cover_SUITE.erl
index 462767f430..0de73bc3d7 100644
--- a/lib/tools/test/cover_SUITE.erl
+++ b/lib/tools/test/cover_SUITE.erl
@@ -37,7 +37,7 @@ all() ->
dont_reconnect_after_stop, stop_node_after_disconnect,
export_import, otp_5031, otp_6115,
otp_8270, otp_10979_hanging_node, otp_14817,
- local_only, startup_race],
+ local_only, startup_race, otp_16476],
case whereis(cover_server) of
undefined ->
[coverage,StartStop ++ NoStartStop];
@@ -1803,6 +1803,17 @@ startup_race_1([]) ->
cover:stop(),
ok.
+otp_16476(Config) when is_list(Config) ->
+ Mod = obvious_booleans,
+ Dir = filename:join(proplists:get_value(data_dir, Config),
+ ?FUNCTION_NAME),
+ ok = file:set_cwd(Dir),
+ {ok, Mod} = compile:file(Mod, [debug_info]),
+ {ok, Mod} = cover:compile(Mod),
+ ok = Mod:Mod(),
+ ok = cover:stop(),
+ ok.
+
%%--Auxiliary------------------------------------------------------------
analyse_expr(Expr, Config) ->
diff --git a/lib/tools/test/cover_SUITE_data/otp_16476/obvious_booleans.erl b/lib/tools/test/cover_SUITE_data/otp_16476/obvious_booleans.erl
new file mode 100644
index 0000000000..1f383be0a5
--- /dev/null
+++ b/lib/tools/test/cover_SUITE_data/otp_16476/obvious_booleans.erl
@@ -0,0 +1,17 @@
+-module(obvious_booleans).
+-export([?MODULE/0]).
+-compile([warnings_as_errors]).
+
+?MODULE() ->
+ true = both_ok(ok, ok),
+ false = both_ok(ok, nok),
+ true = one_ok(ok, nok),
+ true = one_ok(nok, ok),
+ false = one_ok(nok, nok),
+ ok.
+
+both_ok(A, B) ->
+ A =:= ok andalso B =:= ok.
+
+one_ok(A, B) ->
+ A =:= ok orelse B =:= ok.