From 681eb23d31b129e2586403c93d2a3c1dfeb0e34a Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Fri, 20 Dec 2024 09:12:30 +0100 Subject: [PATCH] Fix walrus assignment with member --- src/be_code.c | 2 ++ tests/walrus.be | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/be_code.c b/src/be_code.c index 9f7cf13..0c53ca6 100644 --- a/src/be_code.c +++ b/src/be_code.c @@ -716,6 +716,8 @@ int be_code_setvar(bfuncinfo *finfo, bexpdesc *e1, bexpdesc *e2, bbool keep_reg) free_expreg(finfo, e2); /* free source (checks only ETREG) */ *e2 = *e1; /* now e2 is e1 ETLOCAL */ } + } else { + *e2 = *e1; /* ETLOCAL wins over ETREG */ } break; case ETGLOBAL: /* store to grobal R(A) -> G(Bx) by global index */ diff --git a/tests/walrus.be b/tests/walrus.be index a08090e..ef265ac 100644 --- a/tests/walrus.be +++ b/tests/walrus.be @@ -79,3 +79,19 @@ def check_overwrite_builtin() end check_overwrite_builtin() + +# Bug when dereferencing in a walrus +class Test_walrus_member + var a + def init() + self.a = 2 + end + def f() + var v + if (v := self.a) != nil # here is where the bug happens + return v # 'v' would have a wrong value + end + end +end +var t = Test_walrus_member() +assert(t.f() == 2)