[erlang-bugs] erl_syntax:type/1 fails for binary comprehensions
Matthias Radestock
matthias@REDACTED
Sat Apr 14 08:44:10 CEST 2007
Matthias Radestock <matthias@REDACTED> writes:
> The code in erl_syntax:type/1 is missing a case for the bc (binary
> comprehension) nodes produced by erl_parse.
Here's an example demonstrating this problem:
(fun(Str) ->
{ok, Tokens, _} = erl_scan:string(Str),
{ok, [Expr]} = erl_parse:parse_exprs(Tokens),
erl_prettypr:format(Expr) end)
("<< <<X:1>> || X <- [] >>.").
** exited: {{badarg,
{bc,1,
{bin,
1,
[{bin_element,1,{var,1,'X'},{integer,1,1},default}]},
[{generate,1,{var,1,'X'},{nil,1}}]}},
[{erl_syntax,type,1},
{erl_prettypr,lay_2,2},
{erl_prettypr,format,2},
{erl_eval,do_apply,5},
{shell,exprs,6},
{shell,eval_loop,3}]} **
This, of course, isn't the only place in erl_syntax where support for
binary comprehensions is missing. There's also revert_root/1,
subtrees/1, and make_tree/3
Plus there should be various constructor/accessor functions analogous to
list_comp/2, list_comp_body/1, list_comp_template/1.
Then there are a whole bunch of modules that call into erl_syntax and
are also lacking cases for binary comprehension. For example
erl_prettypr and erl_tidy.
AFAIK binary comprehensions were introduced in R11B-0, which was
released on May 17, 2006. I am somewhat surprised that these bugs have
managed to slip through the net for almost a year. Granted, binary
comprehensions aren't that common, since they are a new feature. In
fact, it appears that the OTP sources only contain one use - in
eval_bits:convert_list/1 - and that was only introduced in R11B-4.
There is an easy way to spot this and other potential bugs in erl_syntax
and friends: run erl_tidy on the OTP sources. Perhaps that should be
added to the OTP test suite?
Regards,
Matthias.
More information about the erlang-bugs
mailing list