aboutsummaryrefslogtreecommitdiffstats
path: root/lib/dialyzer/test
diff options
context:
space:
mode:
authorHans Bolinder <[email protected]>2015-11-26 15:18:39 +0100
committerHans Bolinder <[email protected]>2016-02-08 08:25:38 +0100
commit4884986bc945978177b02a7e81c50a5ea2f007fa (patch)
tree9a6df8eb1a2261e69b19a98c5a6d47bfed674796 /lib/dialyzer/test
parente280686680fddb487f30c73d668091d68764f076 (diff)
downloadotp-4884986bc945978177b02a7e81c50a5ea2f007fa.tar.gz
otp-4884986bc945978177b02a7e81c50a5ea2f007fa.tar.bz2
otp-4884986bc945978177b02a7e81c50a5ea2f007fa.zip
dialyzer: Fix a bug concerning the option 'plt_remove'
[James Fish:] Dialyzer always asserts that files and directories passed in its options exist. Therefore it is not possible to remove a beam/module from a PLT when the beam file no longer exists. Dialyzer should not to check files exist on disk when removing from the PLT.
Diffstat (limited to 'lib/dialyzer/test')
-rw-r--r--lib/dialyzer/test/plt_SUITE.erl43
1 files changed, 39 insertions, 4 deletions
diff --git a/lib/dialyzer/test/plt_SUITE.erl b/lib/dialyzer/test/plt_SUITE.erl
index 16180a7435..6ebe23b54b 100644
--- a/lib/dialyzer/test/plt_SUITE.erl
+++ b/lib/dialyzer/test/plt_SUITE.erl
@@ -8,14 +8,13 @@
-export([suite/0, all/0, build_plt/1, beam_tests/1, update_plt/1,
local_fun_same_as_callback/1,
- run_plt_check/1, run_succ_typings/1]).
+ remove_plt/1, run_plt_check/1, run_succ_typings/1]).
suite() ->
[{timetrap, ?plt_timeout}].
-all() ->
- [build_plt, beam_tests, update_plt, run_plt_check, run_succ_typings,
- local_fun_same_as_callback].
+all() -> [build_plt, beam_tests, update_plt, run_plt_check,
+ remove_plt, run_succ_typings, local_fun_same_as_callback].
build_plt(Config) ->
OutDir = ?config(priv_dir, Config),
@@ -213,6 +212,42 @@ local_fun_same_as_callback(Config) when is_list(Config) ->
{init_plt, Plt}] ++ Opts),
ok.
+%%% [James Fish:]
+%%% Dialyzer always asserts that files and directories passed in its
+%%% options exist. Therefore it is not possible to remove a beam/module
+%%% from a PLT when the beam file no longer exists. Dialyzer should not to
+%%% check files exist on disk when removing from the PLT.
+remove_plt(Config) ->
+ PrivDir = ?config(priv_dir, Config),
+ Prog1 = <<"-module(m1).
+ -export([t/0]).
+ t() ->
+ m2:a(a).">>,
+ {ok, Beam1} = compile(Config, Prog1, m1, []),
+
+ Prog2 = <<"-module(m2).
+ -export([a/1]).
+ a(A) when is_integer(A) -> A.">>,
+ {ok, Beam2} = compile(Config, Prog2, m2, []),
+
+ Plt = filename:join(PrivDir, "remove.plt"),
+ Opts = [{check_plt, true}, {from, byte_code}],
+
+ [{warn_return_no_exit, _, {no_return,[only_normal,t,0]}},
+ {warn_failing_call, _, {call, [m2,a,"('a')",_,_,_,_,_]}}] =
+ dialyzer:run([{analysis_type, plt_build},
+ {files, [Beam1, Beam2]},
+ {get_warnings, true},
+ {output_plt, Plt}] ++ Opts),
+
+ [] = dialyzer:run([{init_plt, Plt},
+ {files, [Beam2]},
+ {analysis_type, plt_remove}]),
+
+ [] = dialyzer:run([{analysis_type, succ_typings},
+ {files, [Beam1]},
+ {init_plt, Plt}] ++ Opts),
+ ok.
compile(Config, Prog, Module, CompileOpts) ->
Source = lists:concat([Module, ".erl"]),