[erlang-bugs] dialyzer: false function has no local return warning in R14B?
Klas Johansson
klas.johansson@REDACTED
Thu Nov 4 23:20:59 CET 2010
On Thu, Nov 4, 2010 at 11:22 PM, Kostis Sagonas <kostis@REDACTED> wrote:
> Klas Johansson wrote:
>>
>> Hi,
>>
>> I get a warning from dialyzer when using ets:select (test case
>> attached), but it seems like a false warning. The fact that the key
>> (#r.k) is a tuple rather than an atom seems important - there's no
>> warning if it's an atom.
>>
>> This is on R14B (as well as earlier versions).
>>
>> Any ideas?
>
> You are sort of right that this is related to the declaration of #r{} and
> its fields. But this is not a dialyzer bug!
>
> Instead, it's a bug in the ms_transform parse transformation which is not
> aware of type declarations in records and messes up things.
>
> To verify that this is the case either comment out the line:
>
> -include_lib("stdlib/include/ms_transform.hrl").
>
> which enables the parse transform, or simply take out the type declaration
> from the record. Dialyzer will then like your module :-)
>
> I am leaving this to the person responsible for the ms parse transform to
> fix.
Ah, I see what's happening here. The parse transform generates this
match specification for me:
[{{r,'_'},[],['$_']}] which is the same as [{#r{_='_'},[],['$_']}]
... but this doesn't match the type specs ('_' is an atom, not a tuple):
-type k() :: {term(), term()}.
-record(r, {k :: k()}).
Tricky. Thanks for your help.
BR,
Klas
More information about the erlang-bugs
mailing list