diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index 545d43ae83..a344816ba8 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -758,7 +758,10 @@ proc genDeref(p: BProc, e: PNode, d: var TLoc) = if typ.kind in {tyUserTypeClass, tyUserTypeClassInst} and typ.isResolvedUserTypeClass: typ = typ.last typ = typ.skipTypes(abstractInstOwned) - if typ.kind in {tyVar} and tfVarIsPtr notin typ.flags and p.module.compileToCpp and e[0].kind == nkHiddenAddr: + if typ.kind in {tyVar} and tfVarIsPtr notin typ.flags and + p.module.compileToCpp and e[0].kind == nkHiddenAddr and + # don't override existing location: + d.k == locNone: d = initLocExprSingleUse(p, e[0][0]) return else: diff --git a/tests/ccgbugs/tvararrayiter.nim b/tests/ccgbugs/tvararrayiter.nim new file mode 100644 index 0000000000..b1f8c2087e --- /dev/null +++ b/tests/ccgbugs/tvararrayiter.nim @@ -0,0 +1,21 @@ +discard """ + targets: "c cpp" +""" + +block: # issue #24274 + iterator foo[T](x: var T): var T = + yield x + + var x: array[3, char] + for a in foo(x): + let b = a + + var y: array[3, char] = ['a', 'b', 'c'] + for a in foo(y): + let b = a + doAssert a[0] == 'a' + doAssert a[1] == 'b' + doAssert a[2] == 'c' + doAssert b[0] == 'a' + doAssert b[1] == 'b' + doAssert b[2] == 'c'