diff options
author | Fredrik Gustafsson <[email protected]> | 2013-01-23 10:51:58 +0100 |
---|---|---|
committer | Fredrik Gustafsson <[email protected]> | 2013-01-23 10:51:58 +0100 |
commit | 744228a03cde1a45e905d563da2546419926c7ee (patch) | |
tree | 200cae2afb8ff20065ba002e2020f191fa373c63 | |
parent | d777ca94944b6a9dbcfd7defc21f59935989e1a4 (diff) | |
parent | 250c2fef8242317c741c83c2b4ec2283fe4bceb5 (diff) | |
download | otp-744228a03cde1a45e905d563da2546419926c7ee.tar.gz otp-744228a03cde1a45e905d563da2546419926c7ee.tar.bz2 otp-744228a03cde1a45e905d563da2546419926c7ee.zip |
Merge branch 'sa/dialyzer-list-spec/OTP-10740'
* sa/dialyzer-list-spec/OTP-10740:
Report spec discrepancy on mismatching lists
Properly support functions with arbitrary arity in type specs.
Conflicts:
lib/dialyzer/test/small_SUITE_data/results/empty_list_infimum
-rw-r--r-- | lib/dialyzer/test/small_SUITE_data/results/empty_list_infimum | 4 | ||||
-rw-r--r-- | lib/dialyzer/test/small_SUITE_data/src/unknown_arity_function_spec.erl | 10 | ||||
-rw-r--r-- | lib/hipe/cerl/erl_types.erl | 4 |
3 files changed, 16 insertions, 2 deletions
diff --git a/lib/dialyzer/test/small_SUITE_data/results/empty_list_infimum b/lib/dialyzer/test/small_SUITE_data/results/empty_list_infimum index a59986cba5..75f1b25725 100644 --- a/lib/dialyzer/test/small_SUITE_data/results/empty_list_infimum +++ b/lib/dialyzer/test/small_SUITE_data/results/empty_list_infimum @@ -1,2 +1,6 @@ +<<<<<<< HEAD empty_list_infimum.erl:39: Invalid type specification for function empty_list_infimum:list_vhost_permissions/1. The success typing is (_) -> [[{_,_}]] +======= +empty_list_infimum.erl:38: Invalid type specification for function empty_list_infimum:list_vhost_permissions/1. The success typing is (_) -> [[{_,_}]] +>>>>>>> sa/dialyzer-list-spec/OTP-10740 diff --git a/lib/dialyzer/test/small_SUITE_data/src/unknown_arity_function_spec.erl b/lib/dialyzer/test/small_SUITE_data/src/unknown_arity_function_spec.erl new file mode 100644 index 0000000000..c7d7459614 --- /dev/null +++ b/lib/dialyzer/test/small_SUITE_data/src/unknown_arity_function_spec.erl @@ -0,0 +1,10 @@ +-module(unknown_arity_function_spec). + +-export([test/2]). + +%-type t() :: 42 | fun((...) -> t()). +%-type f() :: fun((...) -> 42). + +-spec test(fun((...) -> 42), list()) -> 42. +test(F, L) -> + 42 = apply(F, L). diff --git a/lib/hipe/cerl/erl_types.erl b/lib/hipe/cerl/erl_types.erl index f5be8fb08f..ea1e7b1292 100644 --- a/lib/hipe/cerl/erl_types.erl +++ b/lib/hipe/cerl/erl_types.erl @@ -3566,7 +3566,7 @@ t_from_form({type, _L, function, []}, _TypeNames, _InOpaque, _RecDict, t_from_form({type, _L, 'fun', []}, _TypeNames, _InOpaque, _RecDict, _VarDict) -> {t_fun(), []}; -t_from_form({type, _L, 'fun', [{type, _, any, []}, Range]}, TypeNames, +t_from_form({type, _L, 'fun', [{type, _, any}, Range]}, TypeNames, InOpaque, RecDict, VarDict) -> {T, R} = t_from_form(Range, TypeNames, InOpaque, RecDict, VarDict), {t_fun(T), R}; @@ -3909,7 +3909,7 @@ t_form_to_string({type, _L, binary, [Base, Unit]} = Type) -> _ -> io_lib:format("Badly formed bitstr type ~w", [Type]) end; t_form_to_string({type, _L, 'fun', []}) -> "fun()"; -t_form_to_string({type, _L, 'fun', [{type, _, any, []}, Range]}) -> +t_form_to_string({type, _L, 'fun', [{type, _, any}, Range]}) -> "fun(...) -> " ++ t_form_to_string(Range); t_form_to_string({type, _L, 'fun', [{type, _, product, Domain}, Range]}) -> "fun((" ++ string:join(t_form_to_string_list(Domain), ",") ++ ") -> " |