mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-18 13:30:33 +00:00
* fixes #16331; aliasing of tuple construction within a single assignment, great coding style * added test case
This commit is contained in:
@@ -2679,15 +2679,30 @@ proc genTupleConstr(p: BProc, n: PNode, d: var TLoc) =
|
||||
if not handleConstExpr(p, n, d):
|
||||
let t = n.typ
|
||||
discard getTypeDesc(p.module, t) # so that any fields are initialized
|
||||
if d.k == locNone: getTemp(p, t, d)
|
||||
|
||||
var tmp: TLoc
|
||||
# bug #16331
|
||||
let doesAlias = lhsDoesAlias(d.lode, n)
|
||||
let dest = if doesAlias: addr(tmp) else: addr(d)
|
||||
if doesAlias:
|
||||
getTemp(p, n.typ, tmp)
|
||||
elif d.k == locNone:
|
||||
getTemp(p, n.typ, d)
|
||||
|
||||
for i in 0..<n.len:
|
||||
var it = n[i]
|
||||
if it.kind == nkExprColonExpr: it = it[1]
|
||||
initLoc(rec, locExpr, it, d.storage)
|
||||
rec.r = "$1.Field$2" % [rdLoc(d), rope(i)]
|
||||
initLoc(rec, locExpr, it, dest[].storage)
|
||||
rec.r = "$1.Field$2" % [rdLoc(dest[]), rope(i)]
|
||||
rec.flags.incl(lfEnforceDeref)
|
||||
expr(p, it, rec)
|
||||
|
||||
if doesAlias:
|
||||
if d.k == locNone:
|
||||
d = tmp
|
||||
else:
|
||||
genAssignment(p, d, tmp, {})
|
||||
|
||||
proc isConstClosure(n: PNode): bool {.inline.} =
|
||||
result = n[0].kind == nkSym and isRoutine(n[0].sym) and
|
||||
n[1].kind == nkNilLit
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
discard """
|
||||
targets: "c cpp"
|
||||
matrix: "--gc:refc; --gc:arc"
|
||||
"""
|
||||
|
||||
# bug #1833
|
||||
iterator myitems*[T](a: var seq[T]): var T {.inline.} =
|
||||
## iterates over each item of `a` so that you can modify the yielded value.
|
||||
@@ -18,3 +23,13 @@ var ys = @[(1,"a"),(2,"b"),(3,"c")]
|
||||
for y in myitems(ys):
|
||||
inc y[0]
|
||||
|
||||
# bug #16331
|
||||
type T1 = tuple[a, b: int]
|
||||
|
||||
proc p(b: bool): string =
|
||||
var x: T1 = (10, 20)
|
||||
x = if b: (x.b, x.a) else: (-x.b, -x.a)
|
||||
$x
|
||||
|
||||
assert p(false) == "(a: -20, b: -10)"
|
||||
assert p(true) == "(a: 20, b: 10)"
|
||||
|
||||
Reference in New Issue
Block a user