Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
zevv opened this issue Sep 21, 2023 · 6 comments · May be fixed by #23094
Open

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

zevv opened this issue Sep 21, 2023 · 6 comments · May be fixed by #23094

Comments

@zevv
Copy link
Contributor

zevv commented Sep 21, 2023

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 (zevv/npeg#68)

Notes:

  • take away the second foo() macro and things work
  • the problem only seems to occur with the > operator; any other operator compiles just fine
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
Copy link
Member

!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
Copy link
Contributor

@ringabout (member)

devel 👎 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)

AST

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 👎 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)

AST

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 👎 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)

AST

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 👎 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)

AST

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 👎 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)

AST

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 👎 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)

AST

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 👎 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)

AST

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

🤖 Bug found in 20 minutes bisecting 7 commits at 0 commits per second.

@metagn
Copy link
Collaborator

metagn commented Sep 22, 2023

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
Copy link
Contributor Author

zevv commented Sep 23, 2023

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

@metagn
Copy link
Collaborator

metagn commented Sep 23, 2023

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
Copy link
Contributor Author

zevv commented Sep 25, 2023

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!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants