summary refs log tree commit diff stats
path: root/tests/effects/tnestedprocs.nim
blob: 125896d44286e0e9951a2cf70d0cef5a82b5e170 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
discard """
  cmd: "nim check --hints:off $file"
  nimout: '''tnestedprocs.nim(27, 8) Error: 'inner' can have side effects
> tnestedprocs.nim(29, 13) Hint: 'inner' calls `.sideEffect` 'outer2'
>> tnestedprocs.nim(26, 6) Hint: 'outer2' called by 'inner'

tnestedprocs.nim(45, 8) Error: 'inner' can have side effects
> tnestedprocs.nim(47, 13) Hint: 'inner' calls `.sideEffect` 'outer6'
>> tnestedprocs.nim(44, 6) Hint: 'outer6' called by 'inner'

tnestedprocs.nim(58, 41) Error: type mismatch: got <proc ()> but expected 'proc (){.closure, noSideEffect.}'
  Pragma mismatch: got '{..}', but expected '{.noSideEffect.}'.
'''
  errormsg: "type mismatch: got <proc ()> but expected 'proc (){.closure, noSideEffect.}'"
"""
{.experimental: "strictEffects".}
proc outer {.noSideEffect.} =
  proc inner(p: int) =
    if p == 0:
      outer()

  inner(4)

outer()

proc outer2 =
  proc inner(p: int) {.noSideEffect.} =
    if p == 0:
      outer2()

  inner(4)

outer2()

proc outer3(p: int) {.noSideEffect.} =
  proc inner(p: int) {.noSideEffect.} =
    if p == 0:
      p.outer3()

  inner(4)

outer3(5)

proc outer6 =
  proc inner(p: int) {.noSideEffect.} =
    if p == 0:
      outer6()

  inner(4)
  echo "bad"

outer6()


proc outer4 =
  proc inner(p: int) {.noSideEffect.} =
    if p == 0:
      let x: proc () {.noSideEffect.} = outer4
      x()

  inner(4)

outer4()