From 017e756ff4af218bc19918246462a678bf156b66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= Date: Fri, 8 Nov 2024 07:11:00 +0100 Subject: [PATCH] dialyzer: Support modules compiled with `line_coverage` Closes #9027 --- lib/dialyzer/src/dialyzer_dataflow.erl | 2 ++ lib/dialyzer/src/dialyzer_typesig.erl | 2 ++ lib/dialyzer/test/dialyzer_SUITE.erl | 25 ++++++++++++++++++++++--- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/lib/dialyzer/src/dialyzer_dataflow.erl b/lib/dialyzer/src/dialyzer_dataflow.erl index 939397741b1c..fa8bbf00efd1 100644 --- a/lib/dialyzer/src/dialyzer_dataflow.erl +++ b/lib/dialyzer/src/dialyzer_dataflow.erl @@ -1013,6 +1013,8 @@ handle_primop(Tree, Map, State) -> {State, Map, t_any()}; nif_start -> {State, Map, t_any()}; + executable_line -> + {State, Map, t_any()}; Other -> error({'Unsupported primop', Other}) end. diff --git a/lib/dialyzer/src/dialyzer_typesig.erl b/lib/dialyzer/src/dialyzer_typesig.erl index ac6f57836ebc..039b90585f84 100644 --- a/lib/dialyzer/src/dialyzer_typesig.erl +++ b/lib/dialyzer/src/dialyzer_typesig.erl @@ -438,6 +438,8 @@ traverse(Tree, DefinedVars, State) -> {State, t_any()}; nif_start -> {State, t_any()}; + executable_line -> + {State, t_any()}; Other -> erlang:error({'Unsupported primop', Other}) end; seq -> diff --git a/lib/dialyzer/test/dialyzer_SUITE.erl b/lib/dialyzer/test/dialyzer_SUITE.erl index fe6987192af5..a19e6930bc59 100644 --- a/lib/dialyzer/test/dialyzer_SUITE.erl +++ b/lib/dialyzer/test/dialyzer_SUITE.erl @@ -37,7 +37,8 @@ incremental_plt_given_to_classic_mode/1, classic_plt_given_to_incremental_mode/1, if_output_plt_is_missing_incremental_mode_makes_it/1, - file_list/1]). + file_list/1, + line_coverage/1]). suite() -> [{ct_hooks,[ts_install_cth]}]. @@ -46,7 +47,8 @@ all() -> incremental_plt_given_to_classic_mode, classic_plt_given_to_incremental_mode, if_output_plt_is_missing_incremental_mode_makes_it, - file_list]. + file_list, + line_coverage]. groups() -> []. @@ -77,7 +79,7 @@ compile(Config, Prog, Module, CompileOpts) -> PrivDir = proplists:get_value(priv_dir,Config), Filename = filename:join([PrivDir, Source]), ok = file:write_file(Filename, Prog), - Opts = [{outdir, PrivDir}, debug_info | CompileOpts], + Opts = [report, {outdir, PrivDir}, debug_info | CompileOpts], {ok, Module} = compile:file(Filename, Opts), {ok, filename:join([PrivDir, lists:concat([Module, ".beam"])])}. @@ -242,3 +244,20 @@ expected(Files0) -> " atom()\n" || F <- Files], iolist_to_binary(S). +line_coverage(Config) -> + PrivDir = proplists:get_value(priv_dir, Config), + Prog = <<"-module(foo). + bar() -> ok." + >>, + {ok, Beam1} = compile(Config, Prog, foo, [line_coverage]), + + Plt1 = filename:join(PrivDir, "line_coverage.plt"), + _ = dialyzer:run([{analysis_type, plt_build}, + {files, [Beam1]}, + {init_plt, Plt1}, + {from, byte_code}]), + + {ok, [{files, [Beam1]}]} = dialyzer:plt_info(Plt1), + + ok. +