fixes #25553; Invalid codegen for accessing tuple in array (#25555)

fixes #25553

(cherry picked from commit 4566ffaca9)
This commit is contained in:
ringabout
2026-03-01 05:51:38 +08:00
committed by narimiran
parent da1c712b21
commit f7a18fceba
2 changed files with 18 additions and 3 deletions

View File

@@ -1673,7 +1673,7 @@ proc typeRel(c: var TCandidate, f, aOrig: PType,
let roota = if skipBoth or deptha > depthf: a.skipGenericAlias else: a
let rootf = if skipBoth or depthf > deptha: f.skipGenericAlias else: f
if f.isConcept:
result = enterConceptMatch(c, rootf, roota, flags)
elif a.kind == tyGenericInst:
@@ -2187,9 +2187,9 @@ proc implicitConv(kind: TNodeKind, f: PType, arg: PNode, m: TCandidate,
result.typ() = errorType(c)
else:
result.typ() = f.skipTypes({tySink})
# keep varness
# keep varness, but don't wrap lent types with var
if arg.typ != nil and arg.typ.kind == tyVar:
result.typ() = toVar(result.typ, tyVar, c.idgen)
result.typ() = toVar(result.typ.skipTypes({tyLent}), tyVar, c.idgen)
# copy the tfVarIsPtr flag
result.typ.flags = arg.typ.flags
else:

View File

@@ -23,3 +23,18 @@ proc varProc(x: var int) =
doAssert: not compiles(test_lent(x) = 1)
doAssert: not compiles(varProc(test_lent(x)))
type X = tuple[a: int, b: int]
type ArrayBuf*[N: static int, T] = object
buf*: array[N, T]
var v: ArrayBuf[32, X]
# proc `[]`*[N, T](b: var ArrayBuf[N, T], i: BackwardsIndex): lent T = # works
# b.buf[i]
template `[]`*[N, T](b: var ArrayBuf[N, T], i: BackwardsIndex): lent T =
b.buf[i]
doAssert $v[^4] == "(a: 0, b: 0)"