<div dir="ltr">On Sun, Mar 31, 2013 at 4:22 PM, Anthony Ramine <span dir="ltr"><<a href="mailto:n.oxyde@gmail.com" target="_blank">n.oxyde@gmail.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><br>
This patch implements this new error and simplifies how v3_core works with forbidden unsized tail segments in patterns of bit string generators.<br>
<br>
        git fetch <a href="https://github.com/nox/otp" target="_blank">https://github.com/nox/otp</a> illegal-bitstring-gen-pattern<br>
<br>
        <a href="https://github.com/nox/otp/compare/erlang:maint...illegal-bitstring-gen-pattern" target="_blank">https://github.com/nox/otp/compare/erlang:maint...illegal-bitstring-gen-pattern</a><br>
        <a href="https://github.com/nox/otp/compare/erlang:maint...illegal-bitstring-gen-pattern.patch" target="_blank">https://github.com/nox/otp/compare/erlang:maint...illegal-bitstring-gen-pattern.patch</a></blockquote>
<div><br></div><div style>There is a major and a minor issue.</div><div style><br></div><div style>The major issue is that the test suites bs_bincomp_SUITE.erl</div><div style>(compiler application) and erl_eval_SUITE.erl (stdlib application)</div>
<div style>no longer compiles.<br></div><div style><br></div><div style>The minor issue is that erl_eval and eval_bits have assertions</div><div style>to reject bad inputs in case the abstract code has not been</div><div style>
verified by erl_lint. The assertion can be written like this to</div><div style>reject unsized tails in binary generators:</div><div style><br></div><div style><div>diff --git a/lib/stdlib/src/eval_bits.erl b/lib/stdlib/src/eval_bits.erl</div>
<div>index e49cbc1..56be5a6 100644</div><div>--- a/lib/stdlib/src/eval_bits.erl</div><div>+++ b/lib/stdlib/src/eval_bits.erl</div><div>@@ -193,6 +193,13 @@ bin_gen_field({bin_element,Line,VE,Size0,Options0},</div><div>     V = erl_eval:partial_eval(VE),</div>
<div>     NewV = coerce_to_float(V, Type),</div><div>     match_check_size(Mfun, Size1, BBs0),</div><div>+    case Size1 of</div><div>+       {atom,_,all} -></div><div>+           %% An unsized field is forbidden in a generator.</div>
<div>+           throw(invalid);</div><div>+       _ -></div><div>+           ok</div><div>+    end,</div><div>     {value, Size, _BBs} = Efun(Size1, BBs0),</div><div>     bin_gen_field1(Bin, Type, Size, Unit, Sign, Endian, NewV, Bs0, BBs0, Mfun).</div>
<div><br></div></div></div><div><br></div>-- <br>Björn Gustavsson, Erlang/OTP, Ericsson AB
</div></div>