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.47k stars 1.47k forks source link

Generics/macro interaction causes `>` operator to bind too early #22740

Open zevv opened 1 year ago

zevv commented 1 year ago

Description

I have a hard time coming up with a proper title for this issue, please correct me if you know a better one.

The code below fails to compile, there is some funny interaction going on between macros getting expanded from within a generic proc, causing the > operator to be resolved to the "system/comperators/>()" proc, causing the error message.

Error: wrong number of arguments

The snippet is minimized from a real-world problem where Npeg fails to compile when called from generic context (https://github.com/zevv/npeg/issues/68)

Notes:

import macros

macro foo(n: untyped): untyped = 
  discard

# Remove this macro to fix the problem
macro foo(n, n2: untyped): untyped =  
  discard 

# This one is fine
proc test1(v: string) =          
  foo >"test1"

# This one fails to compile    
proc test2[T](v: T) = 
  foo >"test2"

test1("hello")  
test2("hello") 

Nim Version

any

Current Output

Output from the compiler:

/home/ico/sandbox/prjs/npeg/t.nim(15, 7) Error: wrong number of arguments
Traceback (most recent call last)
/home/ico/external/Nim/compiler/nim.nim(164) nim
/home/ico/external/Nim/compiler/nim.nim(119) handleCmdLine
/home/ico/external/Nim/compiler/main.nim(307) mainCommand
/home/ico/external/Nim/compiler/main.nim(276) compileToBackend
/home/ico/external/Nim/compiler/main.nim(138) commandCompileToC
/home/ico/external/Nim/compiler/pipelines.nim(294) compilePipelineProject
/home/ico/external/Nim/compiler/pipelines.nim(224) compilePipelineModule
/home/ico/external/Nim/compiler/pipelines.nim(171) processPipelineModule
/home/ico/external/Nim/compiler/sem.nim(782) semWithPContext
/home/ico/external/Nim/compiler/sem.nim(751) semStmtAndGenerateGenerics
/home/ico/external/Nim/compiler/semstmts.nim(2636) semStmt
/home/ico/external/Nim/compiler/semexprs.nim(1160) semExprNoType
/home/ico/external/Nim/compiler/semexprs.nim(3229) semExpr
/home/ico/external/Nim/compiler/semstmts.nim(2581) semStmtList
/home/ico/external/Nim/compiler/semexprs.nim(3247) semExpr
/home/ico/external/Nim/compiler/semstmts.nim(2398) semProc
/home/ico/external/Nim/compiler/semstmts.nim(2331) semProcAux
/home/ico/external/Nim/compiler/semgnrc.nim(516) semGenericStmt
/home/ico/external/Nim/compiler/semgnrc.nim(506) semGenericStmt
/home/ico/external/Nim/compiler/semgnrc.nim(292) semGenericStmt
/home/ico/external/Nim/compiler/semgnrc.nim(248) semGenericStmt
/home/ico/external/Nim/compiler/semexprs.nim(37) semTemplateExpr
/home/ico/external/Nim/compiler/evaltempl.nim(184) evalTemplate
/home/ico/external/Nim/compiler/evaltempl.nim(139) evalTemplateArgs
/home/ico/external/Nim/compiler/msgs.nim(581) liMessage
/home/ico/external/Nim/compiler/msgs.nim(440) handleError
/home/ico/external/Nim/compiler/msgs.nim(421) quit

### Expected Output

```text
Code compiles

Possible Solution

No response

Additional Information

No response

ringabout commented 1 year ago

!nim c

import macros

macro foo(n: untyped): untyped = 
  discard

# Remove this macro to fix the problem
macro foo(n, n2: untyped): untyped =  
  discard 

# This one is fine
proc test1(v: string) =          
  foo >"test1"

# This one fails to compile    
proc test2[T](v: T) = 
  foo >"test2"

test1("hello")  
test2("hello") 
github-actions[bot] commented 1 year ago

@ringabout (member)

devel :-1: FAIL

Output

Error: Command failed: nim c --run  -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --warnings:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim
/home/runner/work/Nim/Nim/temp.nim(12, 7) Error: wrong number of arguments

Stats

  • Started 2023-09-22T03:41:59
  • Finished 2023-09-22T03:41:59
  • Duration

IR

Compiled filesize 0 bytes (0 bytes) ```cpp ```

AST

```nim nnkStmtList.newTree( nnkImportStmt.newTree( newIdentNode("macros") ), nnkMacroDef.newTree( newIdentNode("foo"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("n"), newIdentNode("untyped"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkMacroDef.newTree( newIdentNode("foo"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("n"), newIdentNode("n2"), newIdentNode("untyped"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkProcDef.newTree( newIdentNode("test1"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("v"), newIdentNode("string"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("foo"), nnkPrefix.newTree( newIdentNode(">"), newLit("test1") ) ) ) ), nnkProcDef.newTree( newIdentNode("test2"), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("v"), newIdentNode("T"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("foo"), nnkPrefix.newTree( newIdentNode(">"), newLit("test2") ) ) ) ), nnkCall.newTree( newIdentNode("test1"), newLit("hello") ), nnkCall.newTree( newIdentNode("test2"), newLit("hello") ) ) ```
stable :-1: FAIL

Output

``` Error: Command failed: nim c --run -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --warnings:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim /home/runner/work/Nim/Nim/temp.nim(12, 7) Error: wrong number of arguments ```

Stats

  • Started 2023-09-22T03:42:00
  • Finished 2023-09-22T03:42:00
  • Duration

IR

Compiled filesize 0 bytes (0 bytes) ```cpp ```

AST

```nim nnkStmtList.newTree( nnkImportStmt.newTree( newIdentNode("macros") ), nnkMacroDef.newTree( newIdentNode("foo"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("n"), newIdentNode("untyped"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkMacroDef.newTree( newIdentNode("foo"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("n"), newIdentNode("n2"), newIdentNode("untyped"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkProcDef.newTree( newIdentNode("test1"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("v"), newIdentNode("string"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("foo"), nnkPrefix.newTree( newIdentNode(">"), newLit("test1") ) ) ) ), nnkProcDef.newTree( newIdentNode("test2"), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("v"), newIdentNode("T"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("foo"), nnkPrefix.newTree( newIdentNode(">"), newLit("test2") ) ) ) ), nnkCall.newTree( newIdentNode("test1"), newLit("hello") ), nnkCall.newTree( newIdentNode("test2"), newLit("hello") ) ) ```
2.0.0 :-1: FAIL

Output

``` Error: Command failed: nim c --run -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --warnings:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim /home/runner/work/Nim/Nim/temp.nim(12, 7) Error: wrong number of arguments ```

Stats

  • Started 2023-09-22T03:42:01
  • Finished 2023-09-22T03:42:01
  • Duration

IR

Compiled filesize 0 bytes (0 bytes) ```cpp ```

AST

```nim nnkStmtList.newTree( nnkImportStmt.newTree( newIdentNode("macros") ), nnkMacroDef.newTree( newIdentNode("foo"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("n"), newIdentNode("untyped"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkMacroDef.newTree( newIdentNode("foo"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("n"), newIdentNode("n2"), newIdentNode("untyped"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkProcDef.newTree( newIdentNode("test1"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("v"), newIdentNode("string"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("foo"), nnkPrefix.newTree( newIdentNode(">"), newLit("test1") ) ) ) ), nnkProcDef.newTree( newIdentNode("test2"), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("v"), newIdentNode("T"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("foo"), nnkPrefix.newTree( newIdentNode(">"), newLit("test2") ) ) ) ), nnkCall.newTree( newIdentNode("test1"), newLit("hello") ), nnkCall.newTree( newIdentNode("test2"), newLit("hello") ) ) ```
1.6.14 :-1: FAIL

Output

``` Error: Command failed: nim c --run -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --warnings:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim /home/runner/work/Nim/Nim/temp.nim(12, 7) Error: wrong number of arguments ```

Stats

  • Started 2023-09-22T03:42:05
  • Finished 2023-09-22T03:42:05
  • Duration

IR

Compiled filesize 0 bytes (0 bytes) ```cpp ```

AST

```nim nnkStmtList.newTree( nnkImportStmt.newTree( newIdentNode("macros") ), nnkMacroDef.newTree( newIdentNode("foo"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("n"), newIdentNode("untyped"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkMacroDef.newTree( newIdentNode("foo"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("n"), newIdentNode("n2"), newIdentNode("untyped"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkProcDef.newTree( newIdentNode("test1"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("v"), newIdentNode("string"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("foo"), nnkPrefix.newTree( newIdentNode(">"), newLit("test1") ) ) ) ), nnkProcDef.newTree( newIdentNode("test2"), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("v"), newIdentNode("T"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("foo"), nnkPrefix.newTree( newIdentNode(">"), newLit("test2") ) ) ) ), nnkCall.newTree( newIdentNode("test1"), newLit("hello") ), nnkCall.newTree( newIdentNode("test2"), newLit("hello") ) ) ```
1.4.8 :-1: FAIL

Output

``` Error: Command failed: nim c --run -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --warnings:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim /home/runner/work/Nim/Nim/temp.nim(12, 7) Error: wrong number of arguments ```

Stats

  • Started 2023-09-22T03:42:08
  • Finished 2023-09-22T03:42:08
  • Duration

IR

Compiled filesize 0 bytes (0 bytes) ```cpp ```

AST

```nim nnkStmtList.newTree( nnkImportStmt.newTree( newIdentNode("macros") ), nnkMacroDef.newTree( newIdentNode("foo"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("n"), newIdentNode("untyped"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkMacroDef.newTree( newIdentNode("foo"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("n"), newIdentNode("n2"), newIdentNode("untyped"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkProcDef.newTree( newIdentNode("test1"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("v"), newIdentNode("string"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("foo"), nnkPrefix.newTree( newIdentNode(">"), newLit("test1") ) ) ) ), nnkProcDef.newTree( newIdentNode("test2"), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("v"), newIdentNode("T"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("foo"), nnkPrefix.newTree( newIdentNode(">"), newLit("test2") ) ) ) ), nnkCall.newTree( newIdentNode("test1"), newLit("hello") ), nnkCall.newTree( newIdentNode("test2"), newLit("hello") ) ) ```
1.2.18 :-1: FAIL

Output

``` Error: Command failed: nim c --run -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --warnings:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim /home/runner/work/Nim/Nim/temp.nim(12, 7) Error: wrong number of arguments ```

Stats

  • Started 2023-09-22T03:42:11
  • Finished 2023-09-22T03:42:11
  • Duration

IR

Compiled filesize 0 bytes (0 bytes) ```cpp ```

AST

```nim nnkStmtList.newTree( nnkImportStmt.newTree( newIdentNode("macros") ), nnkMacroDef.newTree( newIdentNode("foo"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("n"), newIdentNode("untyped"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkMacroDef.newTree( newIdentNode("foo"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("n"), newIdentNode("n2"), newIdentNode("untyped"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkProcDef.newTree( newIdentNode("test1"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("v"), newIdentNode("string"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("foo"), nnkPrefix.newTree( newIdentNode(">"), newLit("test1") ) ) ) ), nnkProcDef.newTree( newIdentNode("test2"), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("v"), newIdentNode("T"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("foo"), nnkPrefix.newTree( newIdentNode(">"), newLit("test2") ) ) ) ), nnkCall.newTree( newIdentNode("test1"), newLit("hello") ), nnkCall.newTree( newIdentNode("test2"), newLit("hello") ) ) ```
1.0.10 :-1: FAIL

Output

``` Error: Command failed: nim c --run -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --warnings:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim /home/runner/work/Nim/Nim/temp.nim(12, 7) Error: wrong number of arguments ```

Stats

  • Started 2023-09-22T03:42:15
  • Finished 2023-09-22T03:42:15
  • Duration

IR

Compiled filesize 0 bytes (0 bytes) ```cpp ```

AST

```nim nnkStmtList.newTree( nnkImportStmt.newTree( newIdentNode("macros") ), nnkMacroDef.newTree( newIdentNode("foo"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("n"), newIdentNode("untyped"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkMacroDef.newTree( newIdentNode("foo"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("n"), newIdentNode("n2"), newIdentNode("untyped"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkProcDef.newTree( newIdentNode("test1"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("v"), newIdentNode("string"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("foo"), nnkPrefix.newTree( newIdentNode(">"), newLit("test1") ) ) ) ), nnkProcDef.newTree( newIdentNode("test2"), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("v"), newIdentNode("T"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("foo"), nnkPrefix.newTree( newIdentNode(">"), newLit("test2") ) ) ) ), nnkCall.newTree( newIdentNode("test1"), newLit("hello") ), nnkCall.newTree( newIdentNode("test2"), newLit("hello") ) ) ```
Stats
  • GCC 11.4.0
  • LibC 2.35
  • Valgrind 3.18.1
  • NodeJS 17.1
  • Linux 6.2.0
  • Created 2023-09-22T03:40:55Z
  • Comments 1
  • Commands nim c --run -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --warnings:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim
:robot: Bug found in 20 minutes bisecting 7 commits at 0 commits per second.
metagn commented 1 year ago

Since foo is ambiguous, it is not immediately expanded like normal untyped macros, but > isn't ambiguous and is a fully untyped macro and so is immediately expanded despite the different parameter count.

We can make specifically > work (and != and >=) by changing its signature to add a non-untyped type anywhere (like template `>`(x, y: typed): bool = y < x). This could break either code using > etc. with untyped arguments or not returning bool, and also code depending on > etc.'s immediate expansion in generic procs, if any such code exists.

zevv commented 1 year ago

In the mean time, would there be a viable workaround for this?

metagn commented 1 year ago

You can define your own template `>`*(a, b: typed): bool anywhere as long as it's in scope, and it won't be evaluated early.

zevv commented 1 year ago

You can define your own template `>`*(a, b: typed): bool anywhere as long as it's in scope, and it won't be evaluated early.

Of course, that should do the trick, thanks!