Compiler crash with abstract modules...
Richard Carlsson
richardc@REDACTED
Tue Mar 29 22:45:53 CEST 2005
Mark Scandariato wrote:
> Interesting crash when compiling the following snippet:
>
> %%%----------------------
> -module(foo, [N]).
> -compile(export_all).
>
> bug(<<V:N/unit:8>>) -> V.
> %%%----------------------
>
> This is equivalent to:
> %%%----------------------
> -module(foo).
> -compile(export_all).
>
> bug(<<V:N/unit:8>>, {foo, N}) -> V.
> %%%----------------------
>
> Which would normally just complain that "variable 'N' is unbound".
Yes, this is a problem with the current implementation, which
expands the parameterized code just as you show; this means that
the variable N becomes bound too late to be used as an argument
to the binary-pattern (but in the case of the parameterized code,
we have already assured the compiler that N is bound, so it
happily passes it on to the backend, which crashes). For various
reasons (mainly efficiency), though, the THIS-variable needs to
be the last passed argument. The best solution for now is to
rewrite the code as
nobug(B) ->
case B of
<<V:N/unit:8>> -> V
end.
(until we can get the compiler to do this by itself). Probably
we should meanwhile complain about N being unbound.
/Richard
More information about the erlang-bugs
mailing list