From d37ec666d7bab6757d541f2b75ddcaa658e390b6 Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Mon, 22 Oct 2018 17:09:15 +0200 Subject: [PATCH] cherry pick --- compiler/ccgexprs.nim | 4 +-- tests/magics/tmagics.nim | 56 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 tests/magics/tmagics.nim diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index b9a2a052ec..4ead0b7d31 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -1976,8 +1976,8 @@ proc genMagicExpr(p: BProc, e: PNode, d: var TLoc, op: TMagic) = frmt = "$1 = $2->len;$n" lineCg(p, cpsStmts, frmt, tmp.r, rdLoc(a)) putIntoDest(p, d, e, tmp.r) - of mGCref: unaryStmt(p, e, d, "#nimGCref($1);$n") - of mGCunref: unaryStmt(p, e, d, "#nimGCunref($1);$n") + of mGCref: unaryStmt(p, e, d, "if ($1) { #nimGCref($1); }$n") + of mGCunref: unaryStmt(p, e, d, "if ($1) { #nimGCunref($1); }$n") of mSetLengthStr: genSetLengthStr(p, e, d) of mSetLengthSeq: genSetLengthSeq(p, e, d) of mIncl, mExcl, mCard, mLtSet, mLeSet, mEqSet, mMulSet, mPlusSet, mMinusSet, diff --git a/tests/magics/tmagics.nim b/tests/magics/tmagics.nim new file mode 100644 index 0000000000..841de56a58 --- /dev/null +++ b/tests/magics/tmagics.nim @@ -0,0 +1,56 @@ +discard """ + output: ''' +true +true +false +true +true +false +true +''' +""" + +block tlowhigh: + type myEnum = enum e1, e2, e3, e4, e5 + var a: array[myEnum, int] + + for i in low(a) .. high(a): + a[i] = 0 + + proc sum(a: openarray[int]): int = + result = 0 + for i in low(a)..high(a): + inc(result, a[i]) + + doAssert sum([1, 2, 3, 4]) == 10 + + +block t8693: + type Foo = int | float + + proc bar(t1, t2: typedesc): bool = + echo (t1 is t2) + (t2 is t1) + + proc bar[T](x: T, t2: typedesc): bool = + echo (T is t2) + (t2 is T) + + doAssert bar(int, Foo) == false + doAssert bar(4, Foo) == false + doAssert bar(any, int) + doAssert bar(int, any) == false + doAssert bar(Foo, Foo) + doAssert bar(any, Foo) + doAssert bar(Foo, any) == false + +block t9442: + var v1: ref char + var v2: string + var v3: seq[char] + GC_ref(v1) + GC_unref(v1) + GC_ref(v2) + GC_unref(v2) + GC_ref(v3) + GC_unref(v3)