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

openSUSE Build Service is sponsored by