From 79f5a74408fab60c21e3905b72fe7dcdcb34eb52 Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Thu, 22 Aug 2024 13:21:13 +0800 Subject: [PATCH] fixes #23454; IndexDefect thrown when destructuring a lent tuple (#23993) fixes #23454 --- compiler/transf.nim | 5 ++++- tests/lent/tlent_from_var.nim | 36 +++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/compiler/transf.nim b/compiler/transf.nim index 7ab4ccae234c..4061a407cba5 100644 --- a/compiler/transf.nim +++ b/compiler/transf.nim @@ -496,7 +496,10 @@ proc transformAddrDeref(c: PTransf, n: PNode, kinds: TNodeKinds): PNode = elif n.typ.skipTypes(abstractInst).kind in {tyVar}: result.typ = toVar(result.typ, n.typ.skipTypes(abstractInst).kind, c.idgen) else: - if n[0].kind in kinds: + if n[0].kind in kinds and + not (n[0][0].kind == nkSym and n[0][0].sym.kind == skForVar and + n[0][0].typ.skipTypes(abstractVar).kind == tyTuple + ): # elimination is harmful to `for tuple unpack` because of newTupleAccess # addr ( deref ( x )) --> x result = n[0][0] if n.typ.skipTypes(abstractVar).kind != tyOpenArray: diff --git a/tests/lent/tlent_from_var.nim b/tests/lent/tlent_from_var.nim index d61ff6dc009a..8cf65e2860ad 100644 --- a/tests/lent/tlent_from_var.nim +++ b/tests/lent/tlent_from_var.nim @@ -50,3 +50,39 @@ template get*[T: not void](self: Opt[T]): T = self.value() method connect*( self: Opt[(int, int)]) = discard self.get()[0] + +block: # bug #23454 + type + Letter = enum + A + + LetterPairs = object + values: seq[(Letter, string)] + + iterator items(list: var LetterPairs): lent (Letter, string) = + for item in list.values: + yield item + + var instance = LetterPairs(values: @[(A, "foo")]) + + for (a, _) in instance: + case a + of A: discard + +block: # bug #23454 + type + Letter = enum + A + + LetterPairs = object + values: seq[(Letter, string)] + + iterator items(list: var LetterPairs): var (Letter, string) = + for item in list.values.mItems: + yield item + + var instance = LetterPairs(values: @[(A, "foo")]) + + for (a, _) in instance: + case a + of A: discard