<br><br><div class="gmail_quote">On 5 July 2012 18:17, Motiejus Jakštys <span dir="ltr"><<a href="mailto:desired.mta@gmail.com" target="_blank">desired.mta@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">On Thu, Jul 05, 2012 at 04:12:01PM +0700, Maxim Treskin wrote:<br>
> Hello<br>
><br>
> I got error when gen_server callback returns not a proper process state,<br>
> but another erlang term(), and dialyzer not warns me about this.<br>
> After specification of Module:handle_cast/2 with<br>
><br>
> -spec handle_cast(Msg :: term(), State :: #state{}) -> {noreply, NewState<br>
> :: #state{}}.<br>
><br>
> where #state{} is record of process state,<br>
<br>
</div>I don't know about this one,<br>
<div class="im"><br>
> it not warns too (it also not warns about {stop, normal, State} return<br>
> value).<br>
<br>
</div>but this is fine. Your function returns a *subtype* of what<br>
Mod:handle_cast/2 is supposed to return.<br>
<br></blockquote><div>No, handle_cast really returns {stop, normal, State}, but this return type not described in -spec of handle_cast, function returns not a subtype of declared type. Dialyzer is silent.</div><div> </div>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
If you added something that is not in return values of handle_cast, like<br>
this:<br>
<br>
-spec handle_cast(term(), #state{}) -> {noreply, NewState} | wrong.<br>
<br>
Dialyzer will warn you that gen_server is not expecting 'wrong'.<br></blockquote><div><br></div><div>Yes, I see such warning:</div><div><br></div><div><div>my_module.erl:215: The return type 'wrong' in the specification of handle_cast/2 is not a subtype of {'noreply',_} | {'noreply',_,'hibernate' | 'infinity' | non_neg_integer()} | {'stop',_,_}, which is the expected return type for the callback of gen_server behaviour</div>
<div>my_module.erl:215: The specification for my_module:handle_cast/2 states that the function might also return 'wrong' but the inferred return is {'noreply',_} | {'stop',{'error',{_,_}},{'state',_}}</div>
</div><div><br></div><div>It seems dialyzer uses less strict declaration of callback from behaviour -callback specification. I think it should be more appreciated to overlap -callback specification from behavior with -spec in callback module. When my_module.erl not contains -spec handle_cast(...) -> ..., dialyzer should use type description from gen_server.erl -callback declaration, but if we want to restrict this type in my_module.erl with -spec declaration this value should be used.</div>
<div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im"><br>
> Code of callback:<br>
><br>
> handle_cast({message}, _State) -><br>
>     NewState = {bugotak},<br>
>     {noreply, NewState};<br>
><br>
> Is it possible to make that dialyzer can see this mistake? Does it check<br>
> types of gen_server callbacks?<br>
<br>
</div>But this one would be interesting indeed.<br>
<span class="HOEnZb"><font color="#888888"><br>
Motiejus<br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br>Max Treskin<br>