Skip to content

Commit

Permalink
add test case to close nim-lang#7974 (nim-lang#22023)
Browse files Browse the repository at this point in the history
close nim-lang#7974 by adding test case
  • Loading branch information
metagn authored and bung87 committed Jul 29, 2023
1 parent fd7a873 commit e79cef3
Showing 1 changed file with 55 additions and 0 deletions.
55 changes: 55 additions & 0 deletions tests/showoff/tgenericmacrotypes.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# issue #7974

import macros

macro genTypeA(arg: typed): untyped =
if arg.typeKind != ntyTypeDesc:
error("expected typedesc", arg)

result = arg.getTypeInst[1]

macro genTypeB(arg: typed): untyped =
if arg.typeKind != ntyTypeDesc:
error("expected typedesc", arg)


let typeSym = arg.getTypeInst[1]
result =
nnkTupleTy.newTree(
nnkIdentDefs.newTree(
ident"a", typeSym, newEmptyNode()
)
)

type
# this is the trivial case, MyTypeA[T] is basically just T, nothing else. But it works.
MyTypeA[T] = genTypeA(T)
# in this case I generate `tuple[a: T]`. This this is something the compiler does not want
MyTypeB[T] = genTypeB(T)

# these are just alias types for int32 and float32, nothing really happens, but it works
var a1: MyTypeA[int32]
doAssert a1 is MyTypeA[int32]
doAssert a1 is int32
a1 = 0'i32
var a2: MyTypeA[float32]
doAssert a2 is MyTypeA[float32]
doAssert a2 is float32
a2 = 0'f32
var a3: MyTypeA[float32]
doAssert a3 is MyTypeA[float32]
doAssert a3 is float32
a3 = 0'f32

var b1: MyTypeB[int32] # cannot generate VM code fur tuple[a: int32]
doAssert b1 is MyTypeB[int32]
doAssert b1 is tuple[a: int32]
b1 = (a: 0'i32)
var b2: MyTypeB[float32]
doAssert b2 is MyTypeB[float32]
doAssert b2 is tuple[a: float32]
b2 = (a: 0'f32)
var b3: MyTypeB[float32]
doAssert b3 is MyTypeB[float32]
doAssert b3 is tuple[a: float32]
b3 = (a: 0'f32)

0 comments on commit e79cef3

Please sign in to comment.