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, noreturn.} = 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)