File 0412-syntax_tools-Fix-crash-when-annotating-a-maybe-witho.patch of Package erlang

From f14ccb5e12904ac3e895c899fdc172ecd4926227 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lukas=20Backstr=C3=B6m?= <lukas@erlang.org>
Date: Tue, 29 Apr 2025 12:20:37 +0200
Subject: [PATCH] syntax_tools: Fix crash when annotating a maybe without else

closes #9773
---
 lib/syntax_tools/src/erl_syntax_lib.erl      | 17 +++++++++++------
 lib/syntax_tools/test/syntax_tools_SUITE.erl | 12 +++++++++++-
 2 files changed, 22 insertions(+), 7 deletions(-)

diff --git a/lib/syntax_tools/src/erl_syntax_lib.erl b/lib/syntax_tools/src/erl_syntax_lib.erl
index 92c430cac3..df2bde61e2 100644
--- a/lib/syntax_tools/src/erl_syntax_lib.erl
+++ b/lib/syntax_tools/src/erl_syntax_lib.erl
@@ -583,14 +583,19 @@ vann_match_expr(Tree, Env) ->
     {ann_bindings(Tree1, Env, Bound, Free), Bound, Free}.
 
 vann_maybe_expr(Tree, Env) ->
+    Bound = [],
     Body = erl_syntax:maybe_expr_body(Tree),
     {B1, {_, Free1}} = vann_body(Body, Env),
-    Else = erl_syntax:maybe_expr_else(Tree),
-    {Else1, _, Free2} = vann_else_expr(Else, Env),
-    Free = ordsets:union(Free1, Free2),
-    Tree1 = rewrite(Tree, erl_syntax:maybe_expr(B1, Else1)),
-    Bound = [],
-    {ann_bindings(Tree1, Env, Bound, Free), Bound, Free}.
+    case erl_syntax:maybe_expr_else(Tree) of
+        none ->
+            Tree1 = rewrite(Tree, erl_syntax:maybe_expr(B1)),
+            {ann_bindings(Tree1, Env, Bound, Free1), Bound, Free1};
+        Else ->
+            {Else1, _, Free2} = vann_else_expr(Else, Env),
+            Free = ordsets:union(Free1, Free2),
+            Tree1 = rewrite(Tree, erl_syntax:maybe_expr(B1, Else1)),
+            {ann_bindings(Tree1, Env, Bound, Free), Bound, Free}
+    end.
 
 vann_maybe_match_expr(Tree, Env) ->
     E = erl_syntax:maybe_match_expr_body(Tree),
diff --git a/lib/syntax_tools/test/syntax_tools_SUITE.erl b/lib/syntax_tools/test/syntax_tools_SUITE.erl
index 4e9cd334ef..26e3fd9e05 100644
--- a/lib/syntax_tools/test/syntax_tools_SUITE.erl
+++ b/lib/syntax_tools/test/syntax_tools_SUITE.erl
@@ -480,7 +480,17 @@ test_maybe_expr_ann(Config) when is_list(Config) ->
     [Env4, Bound4, Free4] = erl_syntax:get_ann(ElseAnn),
     {'env',[]} = Env4,
     {'bound',[]} = Bound4,
-    {'free',[]} = Free4.
+    {'free',[]} = Free4,
+
+    %% Test that it also works when there is no else clause
+    MaybeNoElse = erl_syntax:maybe_expr([MaybeMatch1, MaybeMatch2, Match1]),
+    MaybeNoElseAnn = erl_syntax_lib:annotate_bindings(MaybeNoElse, []),
+    [Env, Bound, Free] = erl_syntax:get_ann(MaybeNoElseAnn),
+    [MaybeMatchAnn1, MaybeMatchAnn2, MatchAnn1] = erl_syntax:maybe_expr_body(MaybeNoElseAnn),
+    NoElseAnn = erl_syntax:maybe_expr_else(MaybeNoElseAnn),
+    [] = erl_syntax:get_ann(NoElseAnn),
+
+    ok.
 
 test_files(Config) ->
     DataDir = ?config(data_dir, Config),
-- 
2.43.0

openSUSE Build Service is sponsored by