[erlang-bugs] lists:concat/1 spec inconsistent with implementation or bug in Dialyzer?

Maria Christakis <>
Wed Jul 28 10:06:44 CEST 2010

On 07/21/2010 07:10 PM, Rickard Olsson wrote:
> Hi,
> When running Dialyzer on the code below I get the following messages: "The
> call lists:concat([['a,...],...]) breaks the contract ([concat_thing()]) ->
> string()" and "Function unused_function/1 will never be called"
> Test code:
> -export([parse/0]).
> parse()->
>      concat(),
>      unused_function(a).
> concat() ->
>      lists:concat([[a]]).
> unused_function(A) ->
>      A.
> The line: "lists:concat([[a]])." runs fine in the shell, but seems to cause
> the dialyzer to stop, which I assume is the reason it warns that
> unused_function/1 will never be used, even though it is used. If the arity
> is changed to 0 and the arguments removed from the call, the warning seems
> to disapear though.
> Is it a bug in the lists:concat/1's spec or in Dialyzer?
> Running:
> openSUSE 11.0 (X86-64)
> Erlang R14A (erts-5.8) [source] [64-bit]
> Dialyzer v2.3.0
> Regards,
> Rickard Olsson
> Erlang Solutions
In my opinion, this is not a bug in the spec and certainly not in 
Dialyzer. The
lists:concat spec is:

-type concat_thing() :: atom() | integer() | float() | string().
-spec concat([concat_thing()]) -> string().

The line: "lists:concat([[a]])." runs (i.e. does not crash) in the shell 
because the term
[a] is assumed to be a string by the lists:concat function. However, 
Dialyzer is able
to distinguish a string from a list of atoms and, since the spec 
declares that this
function should only by used with [concat_thing()], emits a warning. In 
the lists:concat function is supposed to return a list of characters 
(i.e. a string). This
is not the case with the call "lists:concat([[a]])":

 > lists:concat([[a]]).

So it does not crash because it can also handle lists because it has to 
handle strings,
but it does not behave correctly when it is given lists that do not 
contain characters.

More information about the erlang-bugs mailing list