fixes #21317; regression; etyBaseIndex should return fat pointers
This commit is contained in:
parent
b5f64f55d0
commit
cbf3ed9d92
2 changed files with 19 additions and 3 deletions
|
|
@ -2484,17 +2484,18 @@ proc genProc(oldProc: PProc, prc: PSym): Rope =
|
||||||
if prc.typ[0] != nil and sfPure notin prc.flags:
|
if prc.typ[0] != nil and sfPure notin prc.flags:
|
||||||
resultSym = prc.ast[resultPos].sym
|
resultSym = prc.ast[resultPos].sym
|
||||||
let mname = mangleName(p.module, resultSym)
|
let mname = mangleName(p.module, resultSym)
|
||||||
let returnAddress = not isIndirect(resultSym) and
|
# otherwise uses "fat pointers"
|
||||||
|
let useRawPointer = not isIndirect(resultSym) and
|
||||||
resultSym.typ.kind in {tyVar, tyPtr, tyLent, tyRef, tyOwned} and
|
resultSym.typ.kind in {tyVar, tyPtr, tyLent, tyRef, tyOwned} and
|
||||||
mapType(p, resultSym.typ) == etyBaseIndex
|
mapType(p, resultSym.typ) == etyBaseIndex
|
||||||
if returnAddress:
|
if useRawPointer:
|
||||||
resultAsgn = p.indentLine(("var $# = null;$n") % [mname])
|
resultAsgn = p.indentLine(("var $# = null;$n") % [mname])
|
||||||
resultAsgn.add p.indentLine("var $#_Idx = 0;$n" % [mname])
|
resultAsgn.add p.indentLine("var $#_Idx = 0;$n" % [mname])
|
||||||
else:
|
else:
|
||||||
let resVar = createVar(p, resultSym.typ, isIndirect(resultSym))
|
let resVar = createVar(p, resultSym.typ, isIndirect(resultSym))
|
||||||
resultAsgn = p.indentLine(("var $# = $#;$n") % [mname, resVar])
|
resultAsgn = p.indentLine(("var $# = $#;$n") % [mname, resVar])
|
||||||
gen(p, prc.ast[resultPos], a)
|
gen(p, prc.ast[resultPos], a)
|
||||||
if returnAddress:
|
if mapType(p, resultSym.typ) == etyBaseIndex:
|
||||||
returnStmt = "return [$#, $#];$n" % [a.address, a.res]
|
returnStmt = "return [$#, $#];$n" % [a.address, a.res]
|
||||||
else:
|
else:
|
||||||
returnStmt = "return $#;$n" % [a.res]
|
returnStmt = "return $#;$n" % [a.res]
|
||||||
|
|
|
||||||
15
tests/system/trefs.nim
Normal file
15
tests/system/trefs.nim
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
discard """
|
||||||
|
targets: "c js"
|
||||||
|
"""
|
||||||
|
|
||||||
|
# bug #21317
|
||||||
|
proc parseHook*(v: var ref int) =
|
||||||
|
var a: ref int
|
||||||
|
new(a)
|
||||||
|
a[] = 123
|
||||||
|
v = a
|
||||||
|
|
||||||
|
proc fromJson2*(): ref int =
|
||||||
|
parseHook(result)
|
||||||
|
|
||||||
|
doAssert fromJson2()[] == 123
|
||||||
Loading…
Add table
Add a link
Reference in a new issue