diff --git a/compiler/icnif/nifdecoder.nim b/compiler/icnif/nifdecoder.nim index 08ac204064..f10e49c168 100644 --- a/compiler/icnif/nifdecoder.nim +++ b/compiler/icnif/nifdecoder.nim @@ -266,9 +266,12 @@ proc fromNif(c: var DecodeContext; n: var Cursor): PNode = result.flags = flags skipParRi n of nkIdent: - incExpect n, Ident + inc n + let typ = c.fromNifType n + expect n, Ident result = newIdentNode(c.graph.cache.getIdent(pool.strings[n.litId]), c.fromNifLineInfo(n)) inc n + result.typ = typ skipParRi n of nkSym: c.withNode n, result, kind: diff --git a/compiler/icnif/nifencoder.nim b/compiler/icnif/nifencoder.nim index dccdcbd08d..fad4e7de4d 100644 --- a/compiler/icnif/nifencoder.nim +++ b/compiler/icnif/nifencoder.nim @@ -149,6 +149,7 @@ proc toNif(c: var EncodeContext; n: PNode) = of nkIdent: let info = c.toNif n.info c.dest.addParLe pool.tags.getOrIncl(toNifTag(nkIdent)), info + c.toNif n.typ c.dest.addIdent n.ident.s c.dest.addParRi of nkSym: @@ -189,7 +190,7 @@ proc toNif(c: var EncodeContext; n: PNode) = c.withNode n: discard else: - assert n.kind in {nkArgList, nkBracket, nkRecList} or n.len > 0, $n.kind + assert n.kind in {nkArgList, nkBracket, nkRecList, nkPragma} or n.len > 0, $n.kind c.withNode(n): for i in 0 ..< n.len: c.toNif n[i] diff --git a/tests/icnif/tencode_node2node.nim b/tests/icnif/tencode_node2node.nim index 0b3310fba0..6054368d02 100644 --- a/tests/icnif/tencode_node2node.nim +++ b/tests/icnif/tencode_node2node.nim @@ -332,3 +332,4 @@ testNifEncDec(graph, "modtesttypesections.nim") testNifEncDec(graph, "modtestpragmas.nim") testNifEncDec(graph, "modtestprocs.nim") testNifEncDec(graph, "modteststatements.nim") +testNifEncDec(graph, "modtestgenerics.nim") diff --git a/tests/icnif/testcode/modtestgenerics.nim b/tests/icnif/testcode/modtestgenerics.nim new file mode 100644 index 0000000000..dbf023e88c --- /dev/null +++ b/tests/icnif/testcode/modtestgenerics.nim @@ -0,0 +1,43 @@ +type + GenericsType[T] = object + GenericsType2[T] = object + x: T + GenericsType3[T, U] = object + x: T + y: U + GenericsType4[T: int or bool] = distinct int + GenericsType5[N: static[int]; T] = object + x: array[N, T] + GenericsType6[T: SomeNumber] = object + x: T + +var genericsType: GenericsType[int] +var genericsType2: GenericsType2[int] +var genericsType3: GenericsType3[float, string] +var genericsType4: GenericsType4[bool] +var genericsType5: GenericsType5[3, float] +var genericsType6: GenericsType6[int8] + +proc genericsProc[T]() = discard +genericsProc[int]() + +proc genericsProc2[T](x: T) = discard x +genericsProc2(123) + +proc genericsProc3[T, U](x: T; y: U) = discard x +genericsProc3("foo", true) + +proc genericsProc4[T: int or float](x: T): T = x +discard genericsProc4(1.23) + +proc genericsProc5(x: static[int]) = discard x +genericsProc5(123) + +proc genericsProc6[T: SomeNumber](x: T) = discard x +genericsProc6(321) + +proc genericsProc7[T: SomeNumber](x: T): T = x +discard genericsProc7(321) + +proc genericsProc8[N: static[int]; T](x: array[N, T]): T = x[0] +discard genericsProc8([1, 2, 3])