File 1023-debugger-Fix-incorrect-evaluation-of-nested-records-.patch of Package erlang

From 640339f43a743b3bc4e6533194a659fbb717a3d4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
Date: Mon, 18 Mar 2024 12:43:47 +0100
Subject: [PATCH] debugger: Fix incorrect evaluation of nested records in guard

Closes #8120
---
 lib/debugger/src/dbg_ieval.erl     | 17 +++++++++++++++++
 lib/debugger/test/record_SUITE.erl | 29 +++++++++++++++++++++++++++--
 2 files changed, 44 insertions(+), 2 deletions(-)

diff --git a/lib/debugger/src/dbg_ieval.erl b/lib/debugger/src/dbg_ieval.erl
index 2d736898d8..e2dc2e2d31 100644
--- a/lib/debugger/src/dbg_ieval.erl
+++ b/lib/debugger/src/dbg_ieval.erl
@@ -1463,6 +1463,9 @@ guard_expr({'orelse',_,E1,E2}, Bs) ->
 		{value,_Val}=Res -> Res
 	    end
     end;
+guard_expr({'case',_,E0,Cs}, Bs) ->
+    {value,E} = guard_expr(E0, Bs),
+    guard_case_clauses(E, Cs, Bs);
 guard_expr({dbg,_,self,[]}, _) ->
     {value,get(self)};
 guard_expr({safe_bif,_,erlang,'not',As0}, Bs) ->
@@ -1505,6 +1508,20 @@ guard_expr({bin,_,Flds}, Bs) ->
 			   end, [], false),
     {value,V}.
 
+%% guard_case_clauses(Value, Clauses, Bindings, Error, Ieval)
+%%   Error = try_clause | case_clause
+guard_case_clauses(Val, [{clause,_,[P],G,B}|Cs], Bs0) ->
+    case match(P, Val, Bs0) of
+	{match,Bs} ->
+	    case guard(G, Bs) of
+		true ->
+		    guard_expr(hd(B), Bs);
+		false ->
+		    guard_case_clauses(Val, Cs, Bs0)
+	    end;
+	nomatch ->
+	    guard_case_clauses(Val, Cs, Bs0)
+    end.
 
 %% eval_map_fields([Field], Bindings, IEvalState) ->
 %%  {[{map_assoc | map_exact,Key,Value}],Bindings}
diff --git a/lib/debugger/test/record_SUITE.erl b/lib/debugger/test/record_SUITE.erl
index 2f75dcda42..e3d66804bb 100644
--- a/lib/debugger/test/record_SUITE.erl
+++ b/lib/debugger/test/record_SUITE.erl
@@ -28,7 +28,8 @@
 -export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
 	 init_per_testcase/2,end_per_testcase/2,
 	 init_per_suite/1,end_per_suite/1,
-	 errors/1,record_test/1,eval_once/1]).
+         errors/1,record_test/1,eval_once/1,
+         nested_in_guard/1]).
 
 -export([debug/0]).
 
@@ -50,7 +51,7 @@ end_per_group(_GroupName, Config) ->
 
 
 cases() -> 
-    [errors, record_test, eval_once].
+    [errors, record_test, eval_once, nested_in_guard].
 
 init_per_testcase(_Case, Config) ->
     test_lib:interpret(?MODULE),
@@ -295,6 +296,30 @@ once(Test, Record) ->
     end,
     Result.
 
+nested_in_guard(_Config) ->
+    B = #bar{d = []},
+    F = #foo{a = B},
+
+    ok = do_nested_in_guard(#foo{a=#bar{d=[]}}),
+    not_ok = do_nested_in_guard(#foo{a=#bar{}}),
+    not_ok = do_nested_in_guard(#foo{a={no_bar,a,b,c,d}}),
+    not_ok = do_nested_in_guard(#foo{a={bar,a}}),
+    not_ok = do_nested_in_guard(42),
+    not_ok = do_nested_in_guard(#bar{}),
+    not_ok = do_nested_in_guard([]),
+
+    ok.
+
+-define(is_foo(X), (((X#foo.a)#bar.d == []))).
+
+do_nested_in_guard(F) ->
+    if
+        ?is_foo(F) ->
+            ok;
+        true ->
+            not_ok
+    end.
+
 id(I) ->
     I.
 
-- 
2.35.3

openSUSE Build Service is sponsored by