[erlang-questions] code:lib_dir and dialyzer

Nicolas Charpentier <>
Tue Jan 6 07:57:12 CET 2009


Hi,

Running Dialyzer (1.8.3) on my code, I got an error on a call to 
code:lib_dir/1.

Here is the code:lib_dir/1 source:
%% XXX is_list() is for backwards compatibility -- take out in future 
version
-spec lib_dir(App :: atom()) -> string() | {'error', 'bad_name'}.
lib_dir(App) when is_atom(App) ; is_list(App) -> 	call({dir,{lib_dir,App}}).


And here is my test code:
test_lib_dir() ->
	Path = code:lib_dir(kernel),
	Path = code:lib_dir("kernel").

Both calls to code:lib_dir/1 are valid on a runtime system even if the 
clause with the string parameter is kept for backward compatibility

Running Dialyzer on my code, I'm expecting an error like this:
"The call code:lib_dir([101 | 107 | 108 | 110 | 114,...]) breaks the 
contract (atom()) -> string() | {'error', 'bad_name'}".

But I got this one:
"The call code:lib_dir([101 | 107 | 108 | 110 | 114,...]) will never 
return since it differs in argument position 1 from the success typing 
arguments: (atom())"


Is it a dialyzer bug ?


Additional information:
- My PLT is up-to-date and contains the kernel application.
- I'm running dialyzer from the source files.

---
Nicolas Charpentier
http://charpi.net




More information about the erlang-questions mailing list