fixes #23454; IndexDefect thrown when destructuring a lent tuple (#23993)

fixes #23454
This commit is contained in:
ringabout
2024-08-22 13:21:13 +08:00
committed by GitHub
parent 04da0a6028
commit 79f5a74408
2 changed files with 40 additions and 1 deletions

View File

@@ -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:

View File

@@ -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