From f9d516285dfec7db4333e919ca71e7eb0e6a41ed Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
Date: Mon, 5 Sep 2016 12:47:01 +0200
Subject: sys_core_fold: Don't move a fun into a guard

Moving a fun into a guard may cause code that is not accepted
by beam_validator.
---
 lib/compiler/src/sys_core_fold.erl    |  3 ++-
 lib/compiler/test/core_fold_SUITE.erl | 16 ++++++++++++++--
 2 files changed, 16 insertions(+), 3 deletions(-)

(limited to 'lib')

diff --git a/lib/compiler/src/sys_core_fold.erl b/lib/compiler/src/sys_core_fold.erl
index e0de50f3ae..08b02101a6 100644
--- a/lib/compiler/src/sys_core_fold.erl
+++ b/lib/compiler/src/sys_core_fold.erl
@@ -468,7 +468,8 @@ bitstr(#c_bitstr{val=Val,size=Size}=BinSeg, Sub) ->
 %%  Currently, we don't attempt to check binaries because they
 %%  are difficult to check.
 
-is_safe_simple(#c_var{}, _) -> true;
+is_safe_simple(#c_var{}=Var, _) ->
+    not cerl:is_c_fname(Var);
 is_safe_simple(#c_cons{hd=H,tl=T}, Sub) ->
     is_safe_simple(H, Sub) andalso is_safe_simple(T, Sub);
 is_safe_simple(#c_tuple{es=Es}, Sub) -> is_safe_simple_list(Es, Sub);
diff --git a/lib/compiler/test/core_fold_SUITE.erl b/lib/compiler/test/core_fold_SUITE.erl
index 376d2c8e9a..ced0e39d06 100644
--- a/lib/compiler/test/core_fold_SUITE.erl
+++ b/lib/compiler/test/core_fold_SUITE.erl
@@ -26,7 +26,7 @@
 	 unused_multiple_values_error/1,unused_multiple_values/1,
 	 multiple_aliases/1,redundant_boolean_clauses/1,
 	 mixed_matching_clauses/1,unnecessary_building/1,
-	 no_no_file/1]).
+	 no_no_file/1,configuration/1]).
 
 -export([foo/0,foo/1,foo/2,foo/3]).
 
@@ -45,7 +45,7 @@ groups() ->
        unused_multiple_values_error,unused_multiple_values,
        multiple_aliases,redundant_boolean_clauses,
        mixed_matching_clauses,unnecessary_building,
-       no_no_file]}].
+       no_no_file,configuration]}].
 
 
 init_per_suite(Config) ->
@@ -499,4 +499,16 @@ experiment() ->
     end,
     ok.
 
+
+%% Make sure we don't try to move a fun into a guard.
+configuration(_Config) ->
+    {'EXIT',_} = (catch configuration()),
+    ok.
+
+configuration() ->
+    [forgotten || Components <- enemy, is_tuple(fun art/0)].
+
+art() ->
+ creating.
+
 id(I) -> I.
-- 
cgit v1.2.3