[erlang-questions] [Q] dialyzer message: The pattern X can never match the type Y

Kostis Sagonas kostis@REDACTED
Wed May 28 17:53:56 CEST 2008


Ladislav Lenart wrote:
> Hello,
> 
> first I'd like to say that dialyzer is a wonderful and
> easy-to-use tool.

Thanks!

> It has already found several bugs for me :-)

Don't worry: dialyzer has even found several bugs in its own code!

> But I don't understand what dialyzer is trying to tell
> me with a warning like:
> 
>    The pattern X can never match the type Y.
> 
> The actual code seems fine to me. It is similar to:
> 
> 	... CODE REMOVED ...
> 
> However, dialyzer does not report a warning like:

It might have helped if instead of presenting code that does not show 
the warning, you presented code which does.  Anyway, here is a slight 
modification of the program you sent:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-module(mod).
-export([f/1]).

f(Arg) when Arg == foo; Arg == bar; Arg == baz ->
    case Arg of
       foo -> ok1;                 % line 6
       gazonk -> weird;            % line 7
       _ -> ok2
    end.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

dialyzer will report that:

mod.erl:7: The pattern 'gazonk' can never match the type 'bar' | 'baz'

In the first line of the function, the type of the Arg variable is 
constrained to the type 'foo' | 'bar' | 'baz'.  In line 6, 'foo' is 
consumed and the remaining type is 'bar' | 'baz'.  Since 'gazonk' is not 
part of this type, you get the above warning.

Hope this explains what the warning means.

Kostis



More information about the erlang-questions mailing list