File 1903-Add-feature-compr_assign-disallow-in-comprehensions-.patch of Package erlang

From b3069e71368dc73c48b7d9697a2af3a1963b27f4 Mon Sep 17 00:00:00 2001
From: Richard Carlsson <carlsson.richard@gmail.com>
Date: Thu, 30 Jan 2025 10:25:00 +0100
Subject: [PATCH 3/8] Add feature compr_assign, disallow = in comprehensions
 otherwise

---
 lib/stdlib/src/erl_features.erl         |  8 ++++++++
 lib/stdlib/src/erl_lint.erl             | 20 +++++++++++++++++++-
 system/doc/reference_manual/features.md |  3 +++
 3 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/lib/stdlib/src/erl_features.erl b/lib/stdlib/src/erl_features.erl
index d2f420bc38..e57b96f458 100644
--- a/lib/stdlib/src/erl_features.erl
+++ b/lib/stdlib/src/erl_features.erl
@@ -79,6 +79,14 @@ feature_specs() ->
             experimental => 25,
             approved => 27,
             keywords => ['maybe', 'else'],
+            type => extension},
+      compr_assign =>
+          #{short => "Assignment in comprehensions (EEP77)",
+            description =>
+                "Implementation of '=' assignments in comprehensions proposed in EEP77.",
+            status => experimental,
+            experimental => 29,
+            keywords => [],
             type => extension}}.
 
 %% Return all currently known features.
diff --git a/lib/stdlib/src/erl_lint.erl b/lib/stdlib/src/erl_lint.erl
index 7c0e6e685e..ed8fb60406 100644
--- a/lib/stdlib/src/erl_lint.erl
+++ b/lib/stdlib/src/erl_lint.erl
@@ -427,6 +427,13 @@ format_error_1(update_literal) ->
     ~"expression updates a literal";
 format_error_1(illegal_zip_generator) ->
     ~"only generators are allowed in a zip generator.";
+format_error_1(compr_assign) ->
+    ~"""
+     matches using '=' are not allowed in comprehension qualifiers
+     unless the experimental 'compr_assign' language feature is enabled.
+     With 'compr_assign' enabled, a match 'P = E' will behave as a
+     strict generator 'P <-:- [E]'."
+     """;
 %% --- patterns and guards ---
 format_error_1(illegal_map_assoc_in_pattern) -> ~"illegal pattern, did you mean to use `:=`?";
 format_error_1(illegal_pattern) -> ~"illegal pattern";
@@ -4175,12 +4182,23 @@ lc_quals([F|Qs], Vt, Uvt, St0) ->
     Info = is_guard_test2_info(St0),
     {Fvt,St1} = case is_guard_test2(F, Info) of
 		    true -> guard_test(F, Vt, St0);
-		    false -> expr(F, Vt, St0)
+		    false -> expr(F, Vt, check_compr_assign(F, St0))
 		end,
     lc_quals(Qs, vtupdate(Fvt, Vt), Uvt, St1);
 lc_quals([], Vt, Uvt, St) ->
     {Vt, Uvt, St}.
 
+check_compr_assign({match,Anno,_,_}, St) ->
+    case is_feature_enabled(compr_assign, St) of
+        true -> St;
+        false -> add_error(Anno, compr_assign, St)
+    end;
+check_compr_assign(_, St) ->
+    St.
+
+is_feature_enabled(Name, St) ->
+    lists:member(Name, St#lint.features).
+
 is_guard_test2_info(#lint{records=RDs,locals=Locals,imports=Imports}) ->
     {RDs,fun(FA) ->
 		 is_local_function(Locals, FA) orelse
diff --git a/system/doc/reference_manual/features.md b/system/doc/reference_manual/features.md
index 60e4b1f867..39092aeed3 100644
--- a/system/doc/reference_manual/features.md
+++ b/system/doc/reference_manual/features.md
@@ -133,3 +133,6 @@ The following configurable features exist:
   [`maybe`](expressions.md#maybe) expression proposed in
   [EEP 49](https://www.erlang.org/eeps/eep-0049).
   It was approved in Erlang/OTP 27.
+- **`compr_assign` (experimental)** - Implementation of `Pattern = Expr`
+  assignments in [comprehensions](expressions.md#comprehensions)
+  proposed in [EEP 77](https://www.erlang.org/eeps/eep-0077).
-- 
2.51.0

openSUSE Build Service is sponsored by