nim-lang / Nim

Nim is a statically typed compiled systems programming language. It combines successful concepts from mature languages like Python, Ada and Modula. Its design focuses on efficiency, expressiveness, and elegance (in that order of priority).
https://nim-lang.org
Other
16.54k stars 1.47k forks source link

Compiler crash when casting uninstantiated generic proc #12765

Open mratsim opened 4 years ago

mratsim commented 4 years ago

Similar to #12096 but this one is still crashing while #12096 returns an error "Maybe generic arguments are missing?"

type Foo = object
  hook: tuple[onHeartbeat: proc(env: pointer) {.nimcall.}, env: pointer]

type Bar[T] = object
  registeredAt: ptr tuple[onHeartbeat: proc(env: pointer) {.nimcall.}, env: pointer]

proc onHeartbeat[T](bar: ptr Bar[T]) =
  if bar.isNil:
    return

  echo "bazinga"

proc setHeartbeat[T](hook: var tuple[onHeartbeat: proc(env: pointer) {.nimcall.}, env: pointer],
                  bar: var Bar[T]) =

  # Next line is triggering the crash
  # using onHeartbeat[T] instead solves the problem
  hook.onHeartbeat = cast[proc(env: pointer) {.nimcall.}](onHeartbeat)
  hook.env = bar.addr

  bar.registeredAt = hook.addr

var foo: Foo
var bar: Bar[int]

foo.hook.setHeartbeat(bar)
foo.hook.onHeartbeat(foo.hook.env)
Error: internal error: getTypeDescAux(tyGenericParam)
Traceback (most recent call last)
/home/beta/Programming/Nim/Nim/compiler/nim.nim(106) nim
/home/beta/Programming/Nim/Nim/compiler/nim.nim(83) handleCmdLine
/home/beta/Programming/Nim/Nim/compiler/cmdlinehelper.nim(98) loadConfigsAndRunMainCommand
/home/beta/Programming/Nim/Nim/compiler/main.nim(188) mainCommand
/home/beta/Programming/Nim/Nim/compiler/main.nim(92) commandCompileToC
/home/beta/Programming/Nim/Nim/compiler/modules.nim(144) compileProject
/home/beta/Programming/Nim/Nim/compiler/modules.nim(85) compileModule
/home/beta/Programming/Nim/Nim/compiler/passes.nim(210) processModule
/home/beta/Programming/Nim/Nim/compiler/passes.nim(86) processTopLevelStmt
/home/beta/Programming/Nim/Nim/compiler/cgen.nim(1871) myProcess
/home/beta/Programming/Nim/Nim/compiler/ccgstmts.nim(1263) genStmts
/home/beta/Programming/Nim/Nim/compiler/ccgexprs.nim(2620) expr
/home/beta/Programming/Nim/Nim/compiler/ccgexprs.nim(2394) genStmtList
/home/beta/Programming/Nim/Nim/compiler/ccgstmts.nim(1263) genStmts
/home/beta/Programming/Nim/Nim/compiler/ccgexprs.nim(2584) expr
/home/beta/Programming/Nim/Nim/compiler/ccgcalls.nim(572) genCall
/home/beta/Programming/Nim/Nim/compiler/ccgcalls.nim(207) genPrefixCall
/home/beta/Programming/Nim/Nim/compiler/cgen.nim(580) initLocExpr
/home/beta/Programming/Nim/Nim/compiler/ccgexprs.nim(2520) expr
/home/beta/Programming/Nim/Nim/compiler/cgen.nim(1174) genProc
/home/beta/Programming/Nim/Nim/compiler/cgen.nim(1139) genProcNoForward
/home/beta/Programming/Nim/Nim/compiler/cgen.nim(1006) genProcAux
/home/beta/Programming/Nim/Nim/compiler/ccgstmts.nim(1263) genStmts
/home/beta/Programming/Nim/Nim/compiler/ccgexprs.nim(2620) expr
/home/beta/Programming/Nim/Nim/compiler/ccgexprs.nim(2394) genStmtList
/home/beta/Programming/Nim/Nim/compiler/ccgstmts.nim(1263) genStmts
/home/beta/Programming/Nim/Nim/compiler/ccgexprs.nim(2650) expr
/home/beta/Programming/Nim/Nim/compiler/ccgstmts.nim(1252) genAsgn
/home/beta/Programming/Nim/Nim/compiler/ccgstmts.nim(140) loadInto
/home/beta/Programming/Nim/Nim/compiler/ccgexprs.nim(2520) expr
/home/beta/Programming/Nim/Nim/compiler/cgen.nim(1174) genProc
/home/beta/Programming/Nim/Nim/compiler/cgen.nim(1133) genProcNoForward
/home/beta/Programming/Nim/Nim/compiler/cgen.nim(1070) genProcPrototype
/home/beta/Programming/Nim/Nim/compiler/ccgtypes.nim(961) genProcHeader
/home/beta/Programming/Nim/Nim/compiler/ccgtypes.nim(469) genProcParams
/home/beta/Programming/Nim/Nim/compiler/ccgtypes.nim(726) getTypeDescAux
/home/beta/Programming/Nim/Nim/compiler/ccgtypes.nim(895) getTypeDescAux
/home/beta/Programming/Nim/Nim/compiler/msgs.nim(565) internalError
/home/beta/Programming/Nim/Nim/compiler/msgs.nim(443) rawMessage
/home/beta/Programming/Nim/Nim/compiler/msgs.nim(440) rawMessage
/home/beta/Programming/Nim/Nim/compiler/msgs.nim(356) handleError
/home/beta/Programming/Nim/Nim/compiler/msgs.nim(346) quit
FAILURE
shirleyquirk commented 1 year ago

I think I hit the same bug:

type Foo[T] = object
  x:T
echo sizeof(Foo) # internal error: getTypeDescAux{tyGenericParam)

'Maybe generic arguments are missing?' would have been helpful.