summary refs log tree commit diff stats
path: root/compiler
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 /compiler
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 'compiler')
-rw-r--r--compiler/semtypinst.nim3
1 files changed, 2 insertions, 1 deletions
diff --git a/compiler/semtypinst.nim b/compiler/semtypinst.nim
index 47fdc162d..c2599c6f7 100644
--- a/compiler/semtypinst.nim
+++ b/compiler/semtypinst.nim
@@ -290,7 +290,8 @@ proc replaceTypeVarsN(cl: var TReplTypeVars, n: PNode; start=0; expectedType: PT
         replaceTypeVarsS(cl, n.sym, result.typ)
       else:
         replaceTypeVarsS(cl, n.sym, replaceTypeVarsT(cl, n.sym.typ))
-    if result.sym.typ.kind == tyVoid:
+    # sym type can be nil if was gensym created by macro, see #24048
+    if result.sym.typ != nil and result.sym.typ.kind == tyVoid:
       # don't add the 'void' field
       result = newNodeI(nkRecList, n.info)
   of nkRecWhen: