From 05bba156233a8f269ccfa970c1b277684d038d74 Mon Sep 17 00:00:00 2001 From: metagn Date: Mon, 2 Dec 2024 07:21:12 +0300 Subject: [PATCH] fix crash with undeclared proc type pragma macro in generics (#24490) fixes #24489 --- compiler/semtypes.nim | 2 +- tests/pragmas/tundeclaredgenericmacro.nim | 32 +++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 tests/pragmas/tundeclaredgenericmacro.nim diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim index 54e7298d42..4855faf736 100644 --- a/compiler/semtypes.nim +++ b/compiler/semtypes.nim @@ -1867,7 +1867,7 @@ proc applyTypeSectionPragmas(c: PContext; pragmas, operand: PNode): PNode = x.add(operand.copyTreeWithoutNode(p)) # recursion assures that this works for multiple macro annotations too: var r = semOverloadedCall(c, x, x, {skMacro, skTemplate}, {efNoUndeclared}) - if r != nil: + if r != nil and (r.typ == nil or r.typ.kind != tyFromExpr): doAssert r[0].kind == nkSym let m = r[0].sym case m.kind diff --git a/tests/pragmas/tundeclaredgenericmacro.nim b/tests/pragmas/tundeclaredgenericmacro.nim new file mode 100644 index 0000000000..826f1a58e2 --- /dev/null +++ b/tests/pragmas/tundeclaredgenericmacro.nim @@ -0,0 +1,32 @@ +import std/[asyncdispatch, httpclient, strutils, json, times] + +type + Tree[T] = object + x: T + rr: seq[Tree[T]] + I = Tree[int] + F = Tree[Future[string]] + +proc title(t: I): Future[string] {.async,gcsafe.} = + let cli = newAsyncHttpClient() + let c = await cli.getContent("https://jsonplaceholder.typicode.com/todos/" & $t.x) + c.parseJson()["title"].getStr() + +proc map[T,U](t: T, f: proc (x: T): U{.async.gcsafe.}): U = #[tt.Error + ^ invalid pragma: async.gcsafe]# + result.x = f(t) + for r in t.rr: + result.rr.add map(r, f) + +proc f(t: F, l: int) {.async.} = + echo repeat(' ', l), (await t.x) + for r in t.rr: + await f(r, l+1) + +proc asyncMain() {.async.} = + let t = I(x: 1, rr: @[I(x: 2), I(x: 3, rr: @[I(x: 4), I(x: 5)])]) + await f(map[I,F](t, title), 0) + +let a = now() +waitFor asyncMain() +echo now() - a