diff options
Diffstat (limited to 'tests/effects/teffects6.nim')
-rw-r--r-- | tests/effects/teffects6.nim | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/tests/effects/teffects6.nim b/tests/effects/teffects6.nim new file mode 100644 index 000000000..d3af22434 --- /dev/null +++ b/tests/effects/teffects6.nim @@ -0,0 +1,56 @@ +discard """ +action: compile +""" + +# XXX: it is not actually tested if the effects are inferred + +type + PMenu = ref object + PMenuItem = ref object + +proc createMenuItem*(menu: PMenu, label: string, + action: proc (i: PMenuItem, p: pointer) {.cdecl.}) = discard + +var s: PMenu +createMenuItem(s, "Go to definition...", + proc (i: PMenuItem, p: pointer) {.cdecl.} = + try: + echo(i.repr) + except ValueError: + echo("blah") +) + + +proc noRaise(x: proc()) {.raises: [], effectsOf: x.} = + # unknown call that might raise anything, but valid: + x() + +proc doRaise() {.raises: [IoError].} = + raise newException(IoError, "IO") + +proc use*() = + noRaise(doRaise) + # Here the compiler inferes that EIO can be raised. + + +use() + +# bug #12642 +import os + +proc raises() {.raises: Exception.} = discard +proc harmless() {.raises: [].} = discard + +let x = if paramStr(1) == "true": harmless else: raises + +let + choice = 0 + +proc withoutSideEffects(): int = 0 +proc withSideEffects(): int = echo "foo" # the echo causes the side effect + +let procPtr = case choice + of 0: withoutSideEffects + else: withSideEffects + +echo procPtr.repr |