From a1083d7c43e34fddd9097f7d0122db08092a13ac Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Fri, 28 Sep 2018 09:59:45 +0200 Subject: Fix codegen for some set operations Taking the LHS type when a temporary result value was needed lead to bad code being generated if we get a tyRef. Fixes #9098 --- compiler/ccgexprs.nim | 2 +- tests/ccgbugs/t9098.nim | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 tests/ccgbugs/t9098.nim diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index a1365ce07..1789ce4f1 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -1732,7 +1732,7 @@ proc genSetOp(p: BProc, e: PNode, d: var TLoc, op: TMagic) = getTemp(p, getSysType(p.module.g.graph, unknownLineInfo(), tyInt), i) # our counter initLocExpr(p, e.sons[1], a) initLocExpr(p, e.sons[2], b) - if d.k == locNone: getTemp(p, a.t, d) + if d.k == locNone: getTemp(p, setType, d) lineF(p, cpsStmts, "for ($1 = 0; $1 < $2; $1++) $n" & " $3[$1] = $4[$1] $6 $5[$1];$n", [ diff --git a/tests/ccgbugs/t9098.nim b/tests/ccgbugs/t9098.nim new file mode 100644 index 000000000..e1dbb6883 --- /dev/null +++ b/tests/ccgbugs/t9098.nim @@ -0,0 +1,12 @@ +discard """ + targets: "c cpp js" + output: ''' +{'a', 'b'} +''' +""" + +var x = new(ref set[char]) +var y = new(ref set[char]) +x[] = {'a'} +y[] = {'b'} +echo x[] + y[] -- cgit 1.4.1-2-gfad0