diff options
-rw-r--r-- | compiler/transf.nim | 6 | ||||
-rw-r--r-- | tests/ccgbugs/trefseqsort.nim | 33 |
2 files changed, 36 insertions, 3 deletions
diff --git a/compiler/transf.nim b/compiler/transf.nim index baf801cbf..69c526951 100644 --- a/compiler/transf.nim +++ b/compiler/transf.nim @@ -365,7 +365,7 @@ proc transformAddrDeref(c: PTransf, n: PNode, a, b: TNodeKind): PTransNode = # addr ( nkConv ( deref ( x ) ) ) --> nkConv(x) n.sons[0].sons[0] = m.sons[0] result = PTransNode(n.sons[0]) - if n.typ.kind != tyOpenArray: + if n.typ.skipTypes(abstractVar).kind != tyOpenArray: PNode(result).typ = n.typ of nkHiddenStdConv, nkHiddenSubConv, nkConv: var m = n.sons[0].sons[1] @@ -373,13 +373,13 @@ proc transformAddrDeref(c: PTransf, n: PNode, a, b: TNodeKind): PTransNode = # addr ( nkConv ( deref ( x ) ) ) --> nkConv(x) n.sons[0].sons[1] = m.sons[0] result = PTransNode(n.sons[0]) - if n.typ.kind != tyOpenArray: + if n.typ.skipTypes(abstractVar).kind != tyOpenArray: PNode(result).typ = n.typ else: if n.sons[0].kind == a or n.sons[0].kind == b: # addr ( deref ( x )) --> x result = PTransNode(n.sons[0].sons[0]) - if n.typ.kind != tyOpenArray: + if n.typ.skipTypes(abstractVar).kind != tyOpenArray: PNode(result).typ = n.typ proc generateThunk(prc: PNode, dest: PType): PNode = diff --git a/tests/ccgbugs/trefseqsort.nim b/tests/ccgbugs/trefseqsort.nim new file mode 100644 index 000000000..2410770cf --- /dev/null +++ b/tests/ccgbugs/trefseqsort.nim @@ -0,0 +1,33 @@ +discard """ + output: '''@[0, 4, 9, 1, 3, 2] +@[0, 1, 2, 3, 9]''' +""" +# bug #6724 +import algorithm + +type + Bar = object + bar: ref seq[int] + Foo = ref Bar + +proc test(x: ref Foo) = + x.bar[].del(1) + x.bar[].sort(cmp) + +proc main() = + var foo: ref Foo + new(foo) + + var s = @[0, 4, 9, 1, 3, 2] + + var sr: ref seq[int] + new(sr) + sr[] = s + + foo[] = Foo(bar: sr) + echo($foo.bar[]) + + test(foo) + echo($foo.bar[]) + +main() |