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]> |
Hello Björn, I've amended my commit, please refetch. Regards, -- Anthony Ramine Le 26 juin 2013 à 14:52, Anthony Ramine a écrit : > 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