File 1907-Make-comprehension-assignments-work-also-in-erl_eval.patch of Package erlang
From 2fc5a3736caf3cd4e76557fe404722d0d7330aac Mon Sep 17 00:00:00 2001
From: Richard Carlsson <carlsson.richard@gmail.com>
Date: Fri, 9 Jan 2026 10:25:07 +0100
Subject: [PATCH 7/8] Make comprehension assignments work also in erl_eval
---
lib/stdlib/src/erl_eval.erl | 5 ++++-
lib/stdlib/test/erl_eval_SUITE.erl | 21 ++++++++++++++++++++-
2 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/lib/stdlib/src/erl_eval.erl b/lib/stdlib/src/erl_eval.erl
index b72fb6b415..42867b8769 100644
--- a/lib/stdlib/src/erl_eval.erl
+++ b/lib/stdlib/src/erl_eval.erl
@@ -355,7 +355,7 @@ expr(E, Bs, Lf, Ef) ->
-doc false.
check_command(Es, Bs) ->
- Opts = [bitlevel_binaries,binary_comprehension],
+ Opts = [{features,erl_features:enabled()}],
case erl_lint:exprs_opt(Es, bindings(Bs), Opts) of
{ok,_Ws} ->
ok;
@@ -1264,6 +1264,8 @@ eval_zip(E, [{zip, Anno, VarList}|Qs], Bs0, Lf, Ef, FUVs, Acc0, Fun) ->
eval_zip(E, [{zip, Anno, reverse(Rest)}|Qs], Bs0, Lf, Ef, FUVs, Acc1, Fun)
end.
+eval_generator({match,Anno,P,E}, Bs0, Lf, Ef, FUVs, Acc0, CompFun) ->
+ eval_generator({generate_strict,Anno,P,{cons,Anno,E,{nil,Anno}}}, Bs0, Lf, Ef, FUVs, Acc0, CompFun);
eval_generator({Generate,Anno,P,L0}, Bs0, Lf, Ef, FUVs, Acc0, CompFun)
when Generate =:= generate;
Generate =:= generate_strict ->
@@ -1368,6 +1370,7 @@ eval_filter(F, Bs0, Lf, Ef, CompFun, FUVs, Acc) ->
end
end.
+is_generator({match,_,_,_}) -> true;
is_generator({generate,_,_,_}) -> true;
is_generator({generate_strict,_,_,_}) -> true;
is_generator({b_generate,_,_,_}) -> true;
diff --git a/lib/stdlib/test/erl_eval_SUITE.erl b/lib/stdlib/test/erl_eval_SUITE.erl
index 9b8ecbbe4a..1f2bb118f4 100644
--- a/lib/stdlib/test/erl_eval_SUITE.erl
+++ b/lib/stdlib/test/erl_eval_SUITE.erl
@@ -21,6 +21,8 @@
-module(erl_eval_SUITE).
+-feature(compr_assign, enable).
+
-compile(nowarn_obsolete_bool_op).
-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
@@ -66,6 +68,7 @@
binary_and_map_aliases/1,
eep58/1,
strict_generators/1,
+ assignment_generators/1,
binary_skip/1]).
%%
@@ -109,7 +112,7 @@ all() ->
funs, custom_stacktrace, try_catch, eval_expr_5, zero_width,
eep37, eep43, otp_15035, otp_16439, otp_14708, otp_16545, otp_16865,
eep49, binary_and_map_aliases, eep58, strict_generators, binary_skip,
- zlc, zbc, zmc].
+ assignment_generators, zlc, zbc, zmc].
groups() ->
[].
@@ -2334,6 +2337,22 @@ binary_skip(Config) when is_list(Config) ->
[a,a,a]),
ok.
+%% requires compr_assign feature for now
+assignment_generators(Config) when is_list(Config) ->
+ %% erl_eval accepts only features that are enabled in the runtime
+ case lists:member(compr_assign, erl_features:enabled()) of
+ false ->
+ ok;
+ true ->
+ check(fun() -> [Res1 + Res2 || E <- [1,2], EE <- [1,2,3], Res1 = 3*EE, Res2 = 7*E] end,
+ "[Res1 + Res2 || E <- [1,2], EE <- [1,2,3], Res1 = 3*EE, Res2 = 7*E].",
+ [10,13,16,17,20,23]),
+ check(fun() -> [Sqr || E <- [1,2,3,4,5], is_integer(E), Sqr = E*E, Sqr < 20] end,
+ "[Sqr || E <- [1,2,3,4,5], is_integer(E), Sqr = E*E, Sqr < 20].",
+ [1,4,9,16])
+ end,
+ ok.
+
%% Check the string in different contexts: as is; in fun; from compiled code.
check(F, String, Result) ->
check1(F, String, Result),
--
2.51.0