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.23k stars 1.46k forks source link

Compiler crash when trying to pass non-nullary template or macro to proc(p:proc) #17617

Open shirleyquirk opened 3 years ago

shirleyquirk commented 3 years ago

passing a typed template(Ts...) or macro(Ts... to a proc(proc(Ts..)) results in a compiler crash

Example

when true:
  template foo(x:int):int = discard
  proc bar(p:proc(x:int):int) = discard
  #void return type gives identical crash,i.e.
  #template foo(x:int) = discard; proc bar(p:proc(x:int)) = discard
  #same crash with macro foo(args..)
  bar(foo)

Current Output

Error: internal error: expr(skTemplate); unknown symbol
Traceback (most recent call last)
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/nim.nim(125) nim
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/nim.nim(84) handleCmdLine
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/main.nim(242) mainCommand
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/main.nim(213) compileToBackend
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/main.nim(90) commandCompileToC
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/modules.nim(178) compileProject
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/modules.nim(97) compileModule
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/passes.nim(180) processModule
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/passes.nim(73) processTopLevelStmt
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/cgen.nim(1940) myProcess
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/cgen.nim(1934) genTopLevelStmt
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/cgen.nim(1002) genProcBody
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/ccgstmts.nim(1589) genStmts
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/ccgexprs.nim(2816) expr
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/ccgexprs.nim(2547) genStmtList
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/ccgstmts.nim(1589) genStmts
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/ccgexprs.nim(2780) expr
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/ccgcalls.nim(791) genCall
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/ccgcalls.nim(788) genAsgnCall
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/ccgcalls.nim(393) genPrefixCall
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/ccgcalls.nim(374) genParams
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/ccgcalls.nim(297) genArg
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/cgen.nim(641) initLocExprSingleUse
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/ccgexprs.nim(2832) expr
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/ccgexprs.nim(2490) genClosure
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/cgen.nim(628) initLocExpr
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/ccgexprs.nim(2808) expr
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/ccgexprs.nim(2093) genConv
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/ccgexprs.nim(2006) genSomeCast
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/cgen.nim(628) initLocExpr
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/ccgexprs.nim(2761) expr
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/msgs.nim(600) internalErrorImpl
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/msgs.nim(553) liMessage
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/msgs.nim(415) handleError
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/msgs.nim(404) quit
FAILURE

Expected Output

probably type error expected proc(T):T{.closure.} got template but extra credit if it accepts template(T):T

i ran into this trying to @[1,2,3].map(initBigInt), had to check source to find out that initBigint is template initBigInt(x:int):BiggestInt = initBigint(x:int64) where initBigint(x:int64) is a proc

$ nim -v Nim Compiler Version 1.5.1 [Linux: amd64] Compiled at 2021-03-31 Copyright (c) 2006-2021 by Andreas Rumpf

git hash: 7c09e0c75773a2df6469a2acd94f3090aef83255 active boot switches: -d:release

shirleyquirk commented 3 years ago

related crash if the template is untyped

when true:
  template foo(x:int):untyped = discard #or x, 5, $x, etc
  #or template foo(x:untyped):untyped
  proc bar(p: proc(x:int):int) = discard
  bar(foo)

Result:

Error: internal error: /home/bwsq/.choosenim/toolchains/nim-#devel/compiler/seminst.nim(335, 18)
Traceback (most recent call last)
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/nim.nim(125) nim
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/nim.nim(84) handleCmdLine
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/main.nim(242) mainCommand
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/main.nim(213) compileToBackend
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/main.nim(90) commandCompileToC
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/modules.nim(178) compileProject
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/modules.nim(97) compileModule
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/passes.nim(180) processModule
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/passes.nim(73) processTopLevelStmt
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/sem.nim(626) myProcess
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/sem.nim(594) semStmtAndGenerateGenerics
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/semstmts.nim(2276) semStmt
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/semexprs.nim(1042) semExprNoType
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/semexprs.nim(2892) semExpr
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/semstmts.nim(2218) semStmtList
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/semexprs.nim(2819) semExpr
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/semexprs.nim(2340) semWhen
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/semexprs.nim(2892) semExpr
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/semstmts.nim(2218) semStmtList
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/semexprs.nim(2793) semExpr
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/semexprs.nim(1023) semDirectOp
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/semexprs.nim(859) semOverloadedCallAnalyseEffects
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/semcall.nim(566) semOverloadedCall
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/semcall.nim(360) resolveOverloads
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/semcall.nim(95) pickBestCandidate
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/sigmatch.nim(2536) matches
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/sigmatch.nim(2470) matchesAux
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/sigmatch.nim(2196) paramTypesMatch
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/sigmatch.nim(2109) paramTypesMatchAux
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/msgs.nim(613) generateInstance
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/msgs.nim(600) internalErrorImpl
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/msgs.nim(553) liMessage
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/msgs.nim(415) handleError
/home/bwsq/.choosenim/toolchains/nim-#devel/compiler/msgs.nim(404) quit
FAILURE
metagn commented 1 year ago

For the first case, using static proc works, and actually calls the template like a regular template.

The second case (template foo(x: int): untyped) should give a type mismatch error, i.e. "got template (x: int): untyped, expected proc (x: int): int". Probably doesn't currently due to behavior related to auto return types.