fix #19149 Invalid codegen when returning var tuple from a template (#20762)

* fix #19149 Invalid codegen when returning var tuple from a template

* fix type

(cherry picked from commit bae0fb720a)
This commit is contained in:
Bung
2022-11-06 18:49:34 +08:00
committed by narimiran
parent 4e56bcfc0e
commit 0c9c6d2a68
2 changed files with 22 additions and 2 deletions

View File

@@ -1894,7 +1894,7 @@ proc implicitConv(kind: TNodeKind, f: PType, arg: PNode, m: TCandidate,
else:
result.typ = errorType(c)
else:
result.typ = f.skipTypes({tySink})
result.typ = f.skipTypes({tySink, tyVar})
if result.typ == nil: internalError(c.graph.config, arg.info, "implicitConv")
result.add c.graph.emptyNode
result.add arg
@@ -2153,7 +2153,8 @@ proc paramTypesMatchAux(m: var TCandidate, f, a: PType,
of isEqual:
inc(m.exactMatches)
result = arg
if skipTypes(f, abstractVar-{tyTypeDesc}).kind == tyTuple or
let ff = skipTypes(f, abstractVar-{tyTypeDesc})
if ff.kind == tyTuple or
(arg.typ != nil and skipTypes(arg.typ, abstractVar-{tyTypeDesc}).kind == tyTuple):
result = implicitConv(nkHiddenSubConv, f, arg, m, c)
of isNone:

19
tests/template/t19149.nim Normal file
View File

@@ -0,0 +1,19 @@
type Foo = tuple[active: bool, index: int]
var f: Foo
# template result type during match stage
# f:var Foo
# a:Foo
# tyVar
# tyTuple
# after change to proc
# f:Foo
# a:Foo
# tyTuple
# tyTuple
template cursor(): var Foo = f
discard cursor()