Re: Compiler crash with 'inline_list_funcs' and "fun Fun/Arity" notation
Anthony Ramine <[email protected]>
| Newsgroups | gmane.comp.lang.erlang.bugs,gmane.comp.lang.erlang.patches |
|---|---|
| Message-ID | <[email protected]> |
Will amend. -- Anthony Ramine Le 26 juin 2013 à 14:43, Björn Gustavsson a écrit : > Thanks! Looks good. I have only two slight comments: > > If find the first sentence in the commit message confusing: > > "Local fun references look like plain old variables in the Core Erlang > AST and should not be treated as such." > > I would suggest "but" instead of "and": > > "Local fun references look like plain old variables in the Core Erlang > AST, but should not be treated as such." > > The test cases tests that the compiler does not crash and that > the code can be loaded, but it does not test that the code actually > works. I suggest that you rewrite it to something like this: > > ?MODULE() -> > F = fun bar/1, > G = lists:last([(fun (X) when F =:= X -> X end)]), > F = G(F), > ok. > > bar(X) -> > X. > > /Bjorn > > > > On Sat, May 18, 2013 at 6:22 PM, Anthony Ramine <[email protected]> wrote: > Hello, > > This patch fixes the bug by forbidding inlining of variables which values are local fun references outside of application contexts. > > git fetch https://github.com/nox/otp.git fix-fname-inlining > > https://github.com/nox/otp/compare/erlang:maint...fix-fname-inlining > https://github.com/nox/otp/compare/erlang:maint...fix-fname-inlining.patch > > Regards, > > -- > Anthony Ramine > > Le 17 mai 2013 à 20:06, Anthony Ramine a écrit : > > > Hello, > > > > Shorter test case, showing the problem comes from the inline itself and not inline_list_funcs: > > > > -module(test). > > -compile(inline). > > -export([foo/0]). > > > > foo() -> > > F = fun bar/1, > > fun (X) when X =:= F -> X end. > > > > bar(X) -> X. > > > > If you run the core_lint pass, you can see where the problem comes from: > > > > $ erlc +clint test.erl > > test: illegal guard expression in foo/0 > > > > The inliner inlines `when 'erlang':'=:='(X, F)` to `'erlang':'=:='(X, 'bar'/1)` but local fun references can't appear in guards. > > > > I'll try to make a patch. > > > > Regards, > > > > -- > > Anthony Ramine > > > > Le 17 mai 2013 à 10:55, Masatake Daimon a écrit : > > > >> Hello, > >> > >> Compiling the following module makes the compiler crash. I'm using > >> R16B. > >> > >> ===== test.erl ===== > >> -module(test). > >> -compile(inline). > >> -compile(inline_list_funcs). > >> -export([foo/0]). > >> > >> foo() -> > >> lists:map(fun bar/1, [1]). > >> > >> bar(X) -> X. > >> > >> ===== the crash ==== > >> % erlc test.erl > >> test: function '-foo/0-lists^map/1-0-'/1+15: > >> Internal consistency check failed - please report this bug. > >> Instruction: {move,{x,0},{yy,0}} > >> Error: {invalid_store,{yy,0},term}: > >> > >> > >> Note that the problem disappears with any of these changes: > >> > >> * Commenting out "-compile(inline)." > >> * Commenting out "-compile(inline_list_funcs)." > >> * Changing the definition of foo/0 to: > >> foo() -> > >> lists:map(fun bar/1, []). % [] instead of [1] > >> * Changing the definition of foo/0 to: > >> foo() -> > >> lists:map(fun (A) -> bar(A) end, [1]). > >> > >> Regards, > >> -- > >> 大門 正岳 <[email protected]> > >> _______________________________________________ > >> erlang-bugs mailing list > >> [email protected] > >> http://erlang.org/mailman/listinfo/erlang-bugs > > > > _______________________________________________ > erlang-bugs mailing list > [email protected] > http://erlang.org/mailman/listinfo/erlang-bugs > > > > -- > Björn Gustavsson, Erlang/OTP, Ericsson AB _______________________________________________ erlang-bugs mailing list [email protected] http://erlang.org/mailman/listinfo/erlang-bugs