summary refs log tree commit diff stats
path: root/tests/generics/tgensyminst.nim
diff options
context:
space:
mode:
authormetagn <metagngn@gmail.com>2024-09-03 06:45:08 +0300
committerGitHub <noreply@github.com>2024-09-03 05:45:08 +0200
commitd27061f6dabf99255dd677595bed1d9a97ec135e (patch)
tree9503991fe2f17960b187be32790928527f3076c0 /tests/generics/tgensyminst.nim
parent71de7fca9e97d149a150ff6bc08875ba458b178b (diff)
downloadNim-d27061f6dabf99255dd677595bed1d9a97ec135e.tar.gz
fix segfault with gensym node instantiation (#24050)
fixes #24048

Generic lambdas get instantiated via `replaceTypesInBody` which calls
`replaceTypeVarsN` on the body of the lambda. This body can contain sym
nodes of gensym symbols generated by macros, which have `nil` type. But
a piece of code in `replaceTypeVarsN` checks whether the type of a
symbol is equal to `void` without checking if it's `nil` first, which
causes a segfault. Now it also checks that the type of the symbol isn't
`nil` for it to be `void`.
Diffstat (limited to 'tests/generics/tgensyminst.nim')
-rw-r--r--tests/generics/tgensyminst.nim29
1 files changed, 29 insertions, 0 deletions
diff --git a/tests/generics/tgensyminst.nim b/tests/generics/tgensyminst.nim
new file mode 100644
index 000000000..3f30188d8
--- /dev/null
+++ b/tests/generics/tgensyminst.nim
@@ -0,0 +1,29 @@
+# issue #24048
+
+import macros
+
+proc map(fn: proc(val: int): void) = fn(1)
+
+# This works fine, and is the exact same function call as what's
+# generated by the macro `aBug`.
+map proc(val: auto): void =
+  let variable = 123
+
+macro aBug() =
+  # 1. let sym = ident("variable")
+  let sym = genSym(nskLet, "variable")
+  let letStmt = newLetStmt(sym, newLit(123))
+
+  let lambda = newProc(
+    params = @[
+      ident("void"),
+      newIdentDefs(ident("val"), ident("auto")),
+      # 2. newIdentDefs(ident("val"), ident("int")),
+    ],
+    body = newStmtList(letStmt),
+    procType = nnkLambda
+  )
+
+  result = newCall(bindSym("map"), lambda)
+
+aBug()