Dialyzer: Cons will produce an improper list since its 2nd argument is none()

Kostis Sagonas kostis@REDACTED
Fri Feb 14 13:53:23 CET 2020


On 2/14/20 1:44 PM, Jesper Eskilson wrote:
> Hi,
> 
> When dialyzer analyzes this program:
> 
> 
>     -module(foo).
>     -export([main/0]).
>     -record(foo, {x :: integer()}).
>     main() ->
>        [ #foo{x = 0},
>          #foo{x = false} ].
> 
> 
> it says:
> 
>     foo.erl:7: Function main/0 has no local return
>     foo.erl:8: Cons will produce an improper list since its 2nd argument is
>                none()
>     foo.erl:9: Record construction
>                #foo{x :: false} violates the declared type of field x ::
>                integer()
> 
> 
> It seems like dialyzer assumes that any cons with second argument not 
> being a list will produce an improper list, but shouldn't it treat 
> "none()" differently?
> 
> Is this a bug in dialyzer, or a feature whose usefulness I am unable to 
> grasp?

It's a dialyzer feature, which we have purposedly sneaked into the tool 
to discover all users who choose to stop reading all warnings that the 
tool spits out and are not experienced enough to realize that once they 
fix the real culprit, which may not be the first warning that that the 
tool produces, the other warnings will also disappear.

Cheers,
Kostis


More information about the erlang-questions mailing list