Fixes 10202 (#10283)
* Add a test case for #10202 * Fix asgn for object tyVars; fixes #10202 * Check the variant kind before accessing the sym field
This commit is contained in:
parent
98ef545bed
commit
f5cc2e2de5
2 changed files with 29 additions and 12 deletions
|
|
@ -925,7 +925,7 @@ const
|
||||||
|
|
||||||
proc needsNoCopy(p: PProc; y: PNode): bool =
|
proc needsNoCopy(p: PProc; y: PNode): bool =
|
||||||
return y.kind in nodeKindsNeedNoCopy or
|
return y.kind in nodeKindsNeedNoCopy or
|
||||||
((mapType(y.typ) != etyBaseIndex or y.sym.kind == skParam) and
|
((mapType(y.typ) != etyBaseIndex or (y.kind == nkSym and y.sym.kind == skParam)) and
|
||||||
(skipTypes(y.typ, abstractInst).kind in
|
(skipTypes(y.typ, abstractInst).kind in
|
||||||
{tyRef, tyPtr, tyLent, tyVar, tyCString, tyProc} + IntegralTypes))
|
{tyRef, tyPtr, tyLent, tyVar, tyCString, tyProc} + IntegralTypes))
|
||||||
|
|
||||||
|
|
@ -950,7 +950,7 @@ proc genAsgnAux(p: PProc, x, y: PNode, noCopyNeeded: bool) =
|
||||||
lineF(p, "$1 = nimCopy(null, $2, $3);$n",
|
lineF(p, "$1 = nimCopy(null, $2, $3);$n",
|
||||||
[a.rdLoc, b.res, genTypeInfo(p, y.typ)])
|
[a.rdLoc, b.res, genTypeInfo(p, y.typ)])
|
||||||
of etyObject:
|
of etyObject:
|
||||||
if (needsNoCopy(p, y) and needsNoCopy(p, x)) or noCopyNeeded:
|
if x.typ.kind == tyVar or (needsNoCopy(p, y) and needsNoCopy(p, x)) or noCopyNeeded:
|
||||||
lineF(p, "$1 = $2;$n", [a.rdLoc, b.rdLoc])
|
lineF(p, "$1 = $2;$n", [a.rdLoc, b.rdLoc])
|
||||||
else:
|
else:
|
||||||
useMagic(p, "nimCopy")
|
useMagic(p, "nimCopy")
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,3 @@
|
||||||
template doAssert(exp: untyped) =
|
|
||||||
when defined(echot9410):
|
|
||||||
let r = exp
|
|
||||||
echo $(instantiationInfo().line) & ":\n " & astToStr(exp) & "\n was " & repr(r)
|
|
||||||
when not defined(noassertt9410):
|
|
||||||
system.doAssert r
|
|
||||||
else:
|
|
||||||
when not defined(noassertt9410):
|
|
||||||
system.doAssert exp
|
|
||||||
|
|
||||||
template tests =
|
template tests =
|
||||||
block:
|
block:
|
||||||
var i = 0
|
var i = 0
|
||||||
|
|
@ -429,6 +419,33 @@ template tests =
|
||||||
let xptr2 = cast[type(xptr)](p2)
|
let xptr2 = cast[type(xptr)](p2)
|
||||||
doAssert xptr == xptr2
|
doAssert xptr == xptr2
|
||||||
|
|
||||||
|
block: # var types
|
||||||
|
block t10202:
|
||||||
|
type Point = object
|
||||||
|
x: float
|
||||||
|
y: float
|
||||||
|
|
||||||
|
var points: seq[Point]
|
||||||
|
|
||||||
|
points.add(Point(x:1, y:2))
|
||||||
|
|
||||||
|
for i, p in points.mpairs:
|
||||||
|
p.x += 1
|
||||||
|
|
||||||
|
doAssert points[0].x == 2
|
||||||
|
|
||||||
|
block:
|
||||||
|
var ints = @[1, 2, 3]
|
||||||
|
for i, val in mpairs ints:
|
||||||
|
val *= 10
|
||||||
|
doAssert ints == @[10, 20, 30]
|
||||||
|
|
||||||
|
block:
|
||||||
|
var seqOfSeqs = @[@[1, 2], @[3, 4]]
|
||||||
|
for i, val in mpairs seqOfSeqs:
|
||||||
|
val[0] *= 10
|
||||||
|
doAssert seqOfSeqs == @[@[10, 2], @[30, 4]]
|
||||||
|
|
||||||
when false:
|
when false:
|
||||||
block: # openarray
|
block: # openarray
|
||||||
# Error: internal error: genAddr: nkStmtListExpr
|
# Error: internal error: genAddr: nkStmtListExpr
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue