diff options
author | Henrik Nord <[email protected]> | 2011-08-24 15:34:01 +0200 |
---|---|---|
committer | Henrik Nord <[email protected]> | 2011-08-24 15:34:06 +0200 |
commit | adeecbacf58888df01d11c74f031581e2aab9520 (patch) | |
tree | 7e9cb5111796715d59ebc50e025ab61f14ad5226 /lib/dialyzer/test/small_SUITE_data | |
parent | 7d880af82b2aafda9fe88086f790c2ba4d117955 (diff) | |
parent | 3a7af1c4934c0ce4682d88a6dafc178c1d12a703 (diff) | |
download | otp-adeecbacf58888df01d11c74f031581e2aab9520.tar.gz otp-adeecbacf58888df01d11c74f031581e2aab9520.tar.bz2 otp-adeecbacf58888df01d11c74f031581e2aab9520.zip |
Merge branch 'sa/dialyzer-server-loop-fix' into dev
* sa/dialyzer-server-loop-fix:
Fix server loop detection
OTP-9489
Diffstat (limited to 'lib/dialyzer/test/small_SUITE_data')
-rw-r--r-- | lib/dialyzer/test/small_SUITE_data/src/no_return_bug.erl | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/lib/dialyzer/test/small_SUITE_data/src/no_return_bug.erl b/lib/dialyzer/test/small_SUITE_data/src/no_return_bug.erl new file mode 100644 index 0000000000..5c24902590 --- /dev/null +++ b/lib/dialyzer/test/small_SUITE_data/src/no_return_bug.erl @@ -0,0 +1,42 @@ +%% Dialyzer couldn't infer that monitor_diskspace would go in an infinite loop +%% instead of crashing due to the existence of list comprehensions that have a +%% normal success typing. These were added to the monitor_diskspace's SCC and +%% dialyzer_typesig didn't try to assign unit() to monitor_diskspace, as it +%% required all the members of the SCC to return none(). +%% +%% Testcase was submitted in erlang-questions mailing list by Prashanth Mundkur +%% (http://erlang.org/pipermail/erlang-questions/2011-May/058063.html) + +-module(no_return_bug). +-export([diskspace/1, monitor_diskspace/2, refresh_tags/1, monitor_launch/0]). + +-type diskinfo() :: {non_neg_integer(), non_neg_integer()}. + +-spec diskspace(nonempty_string()) -> {'ok', diskinfo()} | {'error', term()}. +diskspace(Path) -> + case Path of + "a" -> {ok, {0,0}}; + _ -> {error, error} + end. + +-spec monitor_diskspace(nonempty_string(), + [{diskinfo(), nonempty_string()}]) -> + no_return(). +monitor_diskspace(Root, Vols) -> + Df = fun(VolName) -> + diskspace(filename:join([Root, VolName])) + end, + NewVols = [{Space, VolName} + || {VolName, {ok, Space}} + <- [{VolName, Df(VolName)} + || {_OldSpace, VolName} <- Vols]], + monitor_diskspace(Root, NewVols). + +-spec refresh_tags(nonempty_string()) -> no_return(). +refresh_tags(Root) -> + {ok, _} = diskspace(Root), + refresh_tags(Root). + +monitor_launch() -> + spawn_link(fun() -> refresh_tags("abc") end), + spawn_link(fun() -> monitor_diskspace("root", [{{0,0}, "a"}]) end). |