[erlang-questions] dialyzer underspecs warning

Krzesimir Sarnecki krzesimir.sarnecki@REDACTED
Fri Aug 8 13:19:26 CEST 2014


I'm learning how to use -specs + dialyzer and I encountered a problem.
I hope you could help me deal with it.

This is my test function:

test(Array, N, Value) ->
    array:set(N, Value, Array).

And this ia a spec I wrote for it:

-spec test(array:array(T), non_neg_integer(), T) -> array:array(T).

When I run dialyzer with -Wunderspecs flag it gives me a warning:
Type specification test:test(array:array(T),non_neg_integer(),T) 
-> array:array(T) is a supertype of the success typing: (very long

To my surprise when I change a spec to:

-spec test(array:array(T), non_neg_integer(), _) -> array:array(T).

Dialyzer doesn't give me the warning anymore.

Am I missing something or dialyzer is telling me that T is a supertype
of any()?

I looked into the source code of array module in stdlib and the -spec 
for set function is the same as my original -spec. Running dialyzer with
the same arguments on the array module doesn't give me warnings (at
least for this function).

What should the -spec for my function look like? And should I always run
dialyzer with -Wunderspecs flag, given it is not a default flag?

Thank you in advance,

More information about the erlang-questions mailing list