summary refs log tree commit diff stats
path: root/tests/macros/t14511.nim
blob: f3b1e2894b17330da1e01d42a7a7e98cf6f0166f (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
discard """
  output: "true\n(y: XInt, a: 5)\n(y: XString, b: \"abc\")"
"""

import macros

block TEST_1:
  # https://github.com/nim-lang/Nim/issues/14511

  template myPragma() {.pragma.}

  type
    XType = enum
      XInt,
      XString,
      XUnused
    X = object
      case y {.myPragma.}: XType
        of XInt, XUnused:
          a: int
        else: # <-- Else case caused the "Error: index 1 not in 0 .. 0" error
          b: string

  var x: X = X(y: XInt, a: 5)
  echo x.y.hasCustomPragma(myPragma)
  echo x
  echo X(y: XString, b: "abc")


block TEST_2:
  template myDevice(val: string) {.pragma.}
  template myKey(val: string) {.pragma.}
  template myMouse(val: string) {.pragma.}

  type
    Device {.pure.} = enum Keyboard, Mouse
    Key = enum Key1, Key2
    Mouse = enum Mouse1, Mouse2

  type
    Obj = object of RootObj
      case device {.myDevice: "MyDevicePragmaStr".}: Device
      of Device.Keyboard:
        key {.myKey: "MyKeyPragmaStr".}: Key
      else: # <-- Else case caused the "Error: index 1 not in 0 .. 0" error
        mouse {.myMouse: "MyMousePragmaStr".}: Mouse

  var obj: Obj
  assert obj.device.hasCustomPragma(myDevice) == true
  assert obj.key.hasCustomPragma(myKey) == true
  assert obj.mouse.hasCustomPragma(myMouse) == true
  assert obj.device.getCustomPragmaVal(myDevice) == "MyDevicePragmaStr"
  assert obj.key.getCustomPragmaVal(myKey) == "MyKeyPragmaStr"
  assert obj.mouse.getCustomPragmaVal(myMouse) == "MyMousePragmaStr"