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