summary refs log tree commit diff stats
path: root/tests/generics/tgenericwhen.nim
blob: e1b23873b4ab94cb8fb6746118a93055b9c51462 (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
discard """
  targets: "c js"
"""

block: # issue #24041
  type ArrayBuf[N: static int, T = byte] = object
    when sizeof(int) > sizeof(uint8):
      when N <= int(uint8.high):
        n: uint8
      else:
        when sizeof(int) > sizeof(uint16):
          when N <= int(uint16.high):
            n: uint16
          else:
            when sizeof(int) > sizeof(uint32):
              when N <= int(uint32.high):
                n: uint32
              else:
                n: int
            else:
              n: int
        else:
          n: int
    else:
      n: int

  var x: ArrayBuf[8]
  doAssert x.n is uint8
  when sizeof(int) > sizeof(uint32):
    var y: ArrayBuf[int(uint32.high) * 8]
    doAssert y.n is int

block: # constant condition after dynamic one
  type Foo[T] = object
    when T is int:
      a: int
    elif true:
      a: string
    else:
      a: bool
  var x: Foo[string]
  doAssert x.a is string
  var y: Foo[int]
  doAssert y.a is int
  var z: Foo[float]
  doAssert z.a is string