diff options
author | Luca Favatella <[email protected]> | 2015-07-02 23:57:37 +0100 |
---|---|---|
committer | Luca Favatella <[email protected]> | 2015-07-11 21:46:40 +0100 |
commit | d0143499cd9ff1c1cf029ff33c65c908229536c7 (patch) | |
tree | 49b26b74a9bf760c8a4896c5f450aa5e4d1c52a1 /lib/hipe | |
parent | 745563e98f6993e279703dc1ad1e9a2c38dfac28 (diff) | |
download | otp-d0143499cd9ff1c1cf029ff33c65c908229536c7.tar.gz otp-d0143499cd9ff1c1cf029ff33c65c908229536c7.tar.bz2 otp-d0143499cd9ff1c1cf029ff33c65c908229536c7.zip |
Teach Dialyzer arity of funs with literal arity
Re-insert logic for `erlang:make_fun/3` in `erl_bif_types`. It had
been removed in bd941f5 while type spec-ing `erlang.erl`. Type spec in
`erlang.erl` cannot express arity of returned fun based on value of
argument hence re-introducing logic in `erl_bif_types`.
Re-definition of logic in `erl_bif_types` follows approach in 9d870a0.
Diffstat (limited to 'lib/hipe')
-rw-r--r-- | lib/hipe/cerl/erl_bif_types.erl | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/lib/hipe/cerl/erl_bif_types.erl b/lib/hipe/cerl/erl_bif_types.erl index 41a6c731c9..9c3bd0a284 100644 --- a/lib/hipe/cerl/erl_bif_types.erl +++ b/lib/hipe/cerl/erl_bif_types.erl @@ -767,6 +767,18 @@ type(erlang, length, 1, Xs, Opaques) -> %% Guard bif, needs to be here. type(erlang, map_size, 1, Xs, Opaques) -> strict(erlang, map_size, 1, Xs, fun (_) -> t_non_neg_integer() end, Opaques); +type(erlang, make_fun, 3, Xs, Opaques) -> + strict(erlang, make_fun, 3, Xs, + fun ([_, _, Arity]) -> + case t_number_vals(Arity, Opaques) of + [N] -> + case is_integer(N) andalso 0 =< N andalso N =< 255 of + true -> t_fun(N, t_any()); + false -> t_none() + end; + _Other -> t_fun() + end + end, Opaques); type(erlang, make_tuple, 2, Xs, Opaques) -> strict(erlang, make_tuple, 2, Xs, fun ([Int, _]) -> @@ -2338,6 +2350,8 @@ arg_types(erlang, length, 1) -> %% Guard bif, needs to be here. arg_types(erlang, map_size, 1) -> [t_map()]; +arg_types(erlang, make_fun, 3) -> + [t_atom(), t_atom(), t_arity()]; arg_types(erlang, make_tuple, 2) -> [t_non_neg_fixnum(), t_any()]; % the value 0 is OK as first argument arg_types(erlang, make_tuple, 3) -> |