diff options
author | Björn Gustavsson <[email protected]> | 2016-10-28 10:13:33 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2016-10-28 10:13:33 +0200 |
commit | 97ee6664899949c5c40dfefa9d8b516ac639fb3c (patch) | |
tree | aad449b470357cfe7a3bf236ecaac3e0f8c3ff26 | |
parent | e402b08254ee9a78a2560e3123e1fb468fa948dc (diff) | |
parent | f957985dc38034bf49711052ef02c14fa054667a (diff) | |
download | otp-97ee6664899949c5c40dfefa9d8b516ac639fb3c.tar.gz otp-97ee6664899949c5c40dfefa9d8b516ac639fb3c.tar.bz2 otp-97ee6664899949c5c40dfefa9d8b516ac639fb3c.zip |
Merge branch 'maint'
* maint:
Don't copy funs into guards
-rw-r--r-- | lib/compiler/src/sys_core_fold.erl | 8 | ||||
-rw-r--r-- | lib/compiler/test/guard_SUITE.erl | 13 |
2 files changed, 20 insertions, 1 deletions
diff --git a/lib/compiler/src/sys_core_fold.erl b/lib/compiler/src/sys_core_fold.erl index feb34b364f..44a6aa425d 100644 --- a/lib/compiler/src/sys_core_fold.erl +++ b/lib/compiler/src/sys_core_fold.erl @@ -1142,7 +1142,13 @@ clause_1(#c_clause{guard=G0,body=B0}=Cl, Ps1, Cexpr, Ctxt, Sub1) -> %% %% case A of NewVar when true -> ... %% - sub_set_var(Var, Cexpr, Sub2); + case cerl:is_c_fname(Cexpr) of + false -> + sub_set_var(Var, Cexpr, Sub2); + true -> + %% We must not copy funs, and especially not into guards. + Sub2 + end; _ -> Sub2 end, diff --git a/lib/compiler/test/guard_SUITE.erl b/lib/compiler/test/guard_SUITE.erl index 6302f82f29..429d6b79e0 100644 --- a/lib/compiler/test/guard_SUITE.erl +++ b/lib/compiler/test/guard_SUITE.erl @@ -87,6 +87,7 @@ misc(Config) when is_list(Config) -> {ok,buf,<<>>} = get_data({o,true,0}, 42, buf), {ok,buf,<<>>} = get_data({o,false,0}, 0, buf), error = get_data({o,false,0}, 42, buf), + ok. @@ -343,6 +344,11 @@ complex_semicolon(Config) when is_list(Config) -> ok = csemi7(#{a=>1}, 3, 3), ok = csemi7(#{a=>1, b=>3}, 0, 0), + %% 8: Make sure that funs cannot be copied into guards. + ok = csemi8(true), + error = csemi8(false), + error = csemi8(42), + ok. csemi1(Type, Val) when is_list(Val), Type == float; @@ -457,6 +463,13 @@ csemi6(_, _) -> error. csemi7(A, B, C) when A#{a:=B} > #{a=>1}; abs(C) > 2 -> ok; csemi7(_, _, _) -> error. +csemi8(Together) -> + case fun csemi8/1 of + Typically when Together; Typically, Together -> ok; + _ -> error + end. + + comma(Config) when is_list(Config) -> %% ',' combinations of literal true/false. |