diff options
Diffstat (limited to 'tests/arc/tcontrolflow.nim')
-rw-r--r-- | tests/arc/tcontrolflow.nim | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/tests/arc/tcontrolflow.nim b/tests/arc/tcontrolflow.nim new file mode 100644 index 000000000..dbc115903 --- /dev/null +++ b/tests/arc/tcontrolflow.nim @@ -0,0 +1,118 @@ +discard """ + output: '''begin A +elif +end A +destroyed +begin false +if +end false +destroyed +begin true +if +end true +7 +##index 2 not in 0 .. 1## +true +''' + cmd: "nim c --gc:arc -d:danger $file" +""" +# we use the -d:danger switch to detect uninitialized stack +# slots more reliably (there shouldn't be any, of course). + +type + Foo = object + id: int + +proc `=destroy`(x: var Foo) = + if x.id != 0: + echo "destroyed" + x.id = 0 + +proc construct(): Foo = Foo(id: 3) + +proc elifIsEasy(cond: bool) = + echo "begin A" + if cond: + echo "if" + elif construct().id == 3: + echo "elif" + else: + echo "else" + echo "end A" + +elifIsEasy(false) + + +proc orIsHard(cond: bool) = + echo "begin ", cond + if cond or construct().id == 3: + echo "if" + else: + echo "else" + echo "end ", cond + +orIsHard(false) +orIsHard(true) + +type + Control = ref object + x: int + + MouseEvent = ref object + control: Control + button: int + +proc run(data: Control) = + var evt = MouseEvent(button: 1) + evt.control = data + if evt.button == 1: + discard + else: + return + + echo data.x + +var c = Control(x: 7) + +run(c) + +proc sysFatal(exceptn: typedesc, message: string) {.inline.} = + var buf = newStringOfCap(200) + add(buf, "##") + add(buf, message) + add(buf, "##") + echo buf + +proc ifexpr(i, a, b: int) {.compilerproc, noinline.} = + sysFatal(IndexDefect, + if b < a: "index out of bounds, the container is empty" + else: "index " & $i & " not in " & $a & " .. " & $b) + +ifexpr(2, 0, 1) + +# bug #14899 +template toSeq(): untyped = + block: + var result = @[1] + result + +proc clItems(s: seq[int]) = + assert s.len == 1 + +proc escapeCheck = + clItems(toSeq()) + +escapeCheck() + +# bug #14900 + +proc seqsEqual(a, b: string): bool = + if false: + false + else: + (var result1 = a; result1) == (var result2 = b; result2) + +# can be const or var too +let expected = "hello" + +echo seqsEqual(expected, expected) |