From ae9a0cbbb446499e759acae47664d1d136d7ba90 Mon Sep 17 00:00:00 2001
From: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Tue, 4 Jun 2024 12:52:52 -0300
Subject: Bug: overlapping assignments

ISO C forbids assignment of a union field to another field of the same
union.
---
 lcode.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/lcode.c b/lcode.c
index caac6ba3..87616140 100644
--- a/lcode.c
+++ b/lcode.c
@@ -776,7 +776,8 @@ void luaK_dischargevars (FuncState *fs, expdesc *e) {
       break;
     }
     case VLOCAL: {  /* already in a register */
-      e->u.info = e->u.var.ridx;
+      int temp = e->u.var.ridx;
+      e->u.info = temp;  /* (can't do a direct assignment; values overlap) */
       e->k = VNONRELOC;  /* becomes a non-relocatable value */
       break;
     }
@@ -1283,8 +1284,9 @@ void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) {
   if (t->k == VUPVAL && !isKstr(fs, k))  /* upvalue indexed by non 'Kstr'? */
     luaK_exp2anyreg(fs, t);  /* put it in a register */
   if (t->k == VUPVAL) {
+    int temp = t->u.info;  /* upvalue index */
     lua_assert(isKstr(fs, k));
-    t->u.ind.t = t->u.info;  /* upvalue index */
+    t->u.ind.t = temp;  /* (can't do a direct assignment; values overlap) */
     t->u.ind.idx = k->u.info;  /* literal short string */
     t->k = VINDEXUP;
   }
-- 
cgit v1.2.3-55-g6feb