[erlang-questions] Why does Dialyzer crash on this map?

Ali Sabil <>
Thu Apr 9 17:21:19 CEST 2015


Sorry for the late reply, I finally managed to get a minimal test case that
reproduces the bug in 17.5:

-module(sum).
-export([
test/1
]).

-spec test(#{atom() => term()}) -> integer().
test(Data) ->
maps:fold(fun
(_Key, Value, Acc) when is_integer(Value) ->
Acc + Value;
(_Key, _Value, Acc) ->
Acc
end, 0, Data).


I don't know if this is the correct fix, but this makes dialyzer work again:

diff --git a/lib/hipe/cerl/erl_types.erl b/lib/hipe/cerl/erl_types.erl
index 4215448..bb4c1c1 100644
--- a/lib/hipe/cerl/erl_types.erl
+++ b/lib/hipe/cerl/erl_types.erl
@@ -4594,6 +4594,8 @@ t_form_to_string({type, _L, list, [Type]}) ->
   "[" ++ t_form_to_string(Type) ++ "]";
 t_form_to_string({type, _L, map, Args}) when not is_list(Args) ->
   "#{}";
+t_form_to_string({type, _L, map_field_assoc, Key, Value}) ->
+  "#{" ++ t_form_to_string(Key) ++ "=>" ++ t_form_to_string(Value) ++ "}";
 t_form_to_string({type, _L, mfa, []}) -> "mfa()";
 t_form_to_string({type, _L, module, []}) -> "module()";
 t_form_to_string({type, _L, node, []}) -> "node()";

Thanks,
Ali

On Tue, Apr 7, 2015 at 2:31 PM Björn-Egil Dahlberg <
> wrote:

> Again - could you provide me with a sample code .. or at least some sort
> of a clue to what you are dialyzing?
>
> 2015-04-07 14:05 GMT+02:00 Ali Sabil <>:
>
>> Hi again,
>>
>> Running dialyzer shipped with 17.5 on the same code base leads now to the
>> following error (17.4 works without any errors):
>>
>> ===> Error in dialyzing apps: Analysis failed with error:
>> {function_clause,[{erl_types,t_form_to_string,
>>                              [{type,36,map_field_assoc,
>>                                     {type,36,atom,[]},
>>                                     {type,36,term,[]}}],
>>                              [{file,"erl_types.erl"},{line,4546}]},
>>                   {erl_types,t_form_to_string_list,2,
>>                              [{file,"erl_types.erl"},{line,4637}]},
>>                   {erl_types,t_form_to_string,1,
>>                              [{file,"erl_types.erl"},{line,4634}]},
>>                   {erl_types,t_form_to_string_list,2,
>>                              [{file,"erl_types.erl"},{line,4637}]},
>>                   {erl_types,t_form_to_string,1,
>>                              [{file,"erl_types.erl"},{line,4634}]},
>>                   {dialyzer_contracts,contract_to_string_1,1,
>>                                       [{file,"dialyzer_contracts.erl"},
>>                                        {line,107}]},
>>                   {dialyzer_contracts,extra_contract_warning,6,
>>                                       [{file,"dialyzer_contracts.erl"},
>>                                        {line,712}]},
>>                   {dialyzer_contracts,picky_contract_check,7,
>>                                       [{file,"dialyzer_contracts.erl"},
>>                                        {line,686}]}]}
>> Last messages in the log cache:
>>   Reading files and computing callgraph... done in 1.21 secs
>>   Removing edges... done in 0.04 secs
>>
>>
>> On Wed, Mar 18, 2015 at 12:12 PM Björn-Egil Dahlberg <>
>> wrote:
>>
>>> On 2015-03-18 12:01, Ali Sabil wrote:
>>> > I tried to create a minimal testcase but I unfortunately haven't been
>>> > able to. I was running dialyzer on a quite large code base and now
>>> > even the unpatched dialyzer works without any issue after I fixed all
>>> > the issues reported by dialyzer.
>>>
>>> Ah, well .. I suspect it was the missing clause in find_terminals and I
>>> had it on a TODO somewhere. Should be included to 17.5.
>>>
>>> // Björn-Egil
>>>
>>
>> _______________________________________________
>> erlang-questions mailing list
>> 
>> http://erlang.org/mailman/listinfo/erlang-questions
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20150409/4de8348c/attachment.html>


More information about the erlang-questions mailing list