summary refs log tree commit diff stats
path: root/tests/discard/tdiscardable.nim
blob: 032050139718820537e6660909e9cc4f29595f4d (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
64
65
66
67
discard """
output: '''
tdiscardable
1
1
something defered
something defered
'''
"""

echo "tdiscardable"

# Test the discardable pragma

proc p(x, y: int): int {.discardable.} =
  return x + y

# test that it is inherited from generic procs too:
proc q[T](x, y: T): T {.discardable.} =
  return x + y


p(8, 2)
q[float](0.8, 0.2)

# bug #942

template maybeMod(x: SomeInteger, module: Natural): untyped =
  if module > 0: x mod module
  else: x

proc foo(b: int):int =
  var x = 1
  result = x.maybeMod(b) # Works fine

proc bar(b: int):int =
  result = 1
  result = result.maybeMod(b) # Error: value returned by statement has to be discarded

echo foo(0)
echo bar(0)

# bug #9726

proc foo: (proc: int) =
  proc bar: int = 1
  return bar

discard foo()

# bug #10842

proc myDiscardable(): int {.discardable.} =
  discard

proc main1() =
  defer:
    echo "something defered"
  discard myDiscardable()

proc main2() =
  defer:
    echo "something defered"
  myDiscardable()

main1()
main2()