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

Overloaded template causes untyped param is resolved when called. #23662

Open
litlighilit opened this issue May 30, 2024 · 6 comments
Open

Overloaded template causes untyped param is resolved when called. #23662

litlighilit opened this issue May 30, 2024 · 6 comments

Comments

@litlighilit
Copy link
Contributor

litlighilit commented May 30, 2024

Description

If a template with untyped params is overloaded, then when the variant with untyped param is called, such a argument (symbol) will be resolved there.

template t(n: float) = discard
template t(todecl: untyped, x: int) =
  discard  # or: let todecl = x

t(ii, 3)   # <-  here `ii` is resolved.

In addition, either of the followings compiles without mistake:

template t(todecl: untyped, x: int) = discard
template t(todecl: untyped, n: char) = discard
t(ii, 3)  # ✓ works

Or

template t(todecl: untyped, x: int) = discard
t(ii, 3)   # ✓ works

Nim Version

Nim Compiler Version 2.1.1 [Windows: amd64]
Compiled at 2024-04-27
Copyright (c) 2006-2024 by Andreas Rumpf

active boot switches: -d:release

Current Output

Error: undeclared identifier: 'ii'

Expected Output

(None)

Possible Solution

No response

Additional Information

So does for macro, proc, etc.

@litlighilit litlighilit changed the title Overloaded template causes untyped param is resolved. Overloaded template causes untyped param is resolved when called. May 30, 2024
@juancarlospaco
Copy link
Collaborator

!nim c

template t(n: float) = discard
template t(todecl: untyped, x: int) =
  discard

t(ii, 3)

Copy link
Contributor

🐧 Linux bisect by @juancarlospaco (collaborator)
devel 👎 FAIL

Output

Error: Command failed: nim c --run  -d:nimDebug -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints: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(4, 3) Error: undeclared identifier: 'ii'
assertions.nim(34)       raiseAssert
Error: unhandled exception: errGenerated [AssertionDefect]

IR

Compiled filesize 0 bytes (0 bytes)

Stats

  • Started 2024-05-30T13:13:12
  • Finished 2024-05-30T13:13:12
  • Duration

AST

nnkStmtList.newTree(
  nnkTemplateDef.newTree(
    newIdentNode("t"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("n"),
        newIdentNode("float"),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkTemplateDef.newTree(
    newIdentNode("t"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("todecl"),
        newIdentNode("untyped"),
        newEmptyNode()
      ),
      nnkIdentDefs.newTree(
        newIdentNode("x"),
        newIdentNode("int"),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkCall.newTree(
    newIdentNode("t"),
    newIdentNode("ii"),
    newLit(3)
  )
)
stable 👎 FAIL

Output

Error: Command failed: nim c --run  -d:nimDebug -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints: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(4, 3) Error: undeclared identifier: 'ii'
assertions.nim(34)       raiseAssert
Error: unhandled exception: options.nim(681, 5) `false` errGenerated [AssertionDefect]

IR

Compiled filesize 0 bytes (0 bytes)

Stats

  • Started 2024-05-30T13:13:13
  • Finished 2024-05-30T13:13:13
  • Duration

AST

nnkStmtList.newTree(
  nnkTemplateDef.newTree(
    newIdentNode("t"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("n"),
        newIdentNode("float"),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkTemplateDef.newTree(
    newIdentNode("t"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("todecl"),
        newIdentNode("untyped"),
        newEmptyNode()
      ),
      nnkIdentDefs.newTree(
        newIdentNode("x"),
        newIdentNode("int"),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkCall.newTree(
    newIdentNode("t"),
    newIdentNode("ii"),
    newLit(3)
  )
)
2.0.4 👎 FAIL

Output

Error: Command failed: nim c --run  -d:nimDebug -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints: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(4, 3) Error: undeclared identifier: 'ii'
assertions.nim(34)       raiseAssert
Error: unhandled exception: options.nim(681, 5) `false` errGenerated [AssertionDefect]

IR

Compiled filesize 0 bytes (0 bytes)

Stats

  • Started 2024-05-30T13:13:13
  • Finished 2024-05-30T13:13:13
  • Duration

AST

nnkStmtList.newTree(
  nnkTemplateDef.newTree(
    newIdentNode("t"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("n"),
        newIdentNode("float"),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkTemplateDef.newTree(
    newIdentNode("t"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("todecl"),
        newIdentNode("untyped"),
        newEmptyNode()
      ),
      nnkIdentDefs.newTree(
        newIdentNode("x"),
        newIdentNode("int"),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkCall.newTree(
    newIdentNode("t"),
    newIdentNode("ii"),
    newLit(3)
  )
)
2.0.0 👎 FAIL

Output

Error: Command failed: nim c --run  -d:nimDebug -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints: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(4, 3) Error: undeclared identifier: 'ii'
assertions.nim(34)       raiseAssert
Error: unhandled exception: options.nim(664, 5) `false` errGenerated [AssertionDefect]

IR

Compiled filesize 0 bytes (0 bytes)

Stats

  • Started 2024-05-30T13:13:17
  • Finished 2024-05-30T13:13:17
  • Duration

AST

nnkStmtList.newTree(
  nnkTemplateDef.newTree(
    newIdentNode("t"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("n"),
        newIdentNode("float"),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkTemplateDef.newTree(
    newIdentNode("t"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("todecl"),
        newIdentNode("untyped"),
        newEmptyNode()
      ),
      nnkIdentDefs.newTree(
        newIdentNode("x"),
        newIdentNode("int"),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkCall.newTree(
    newIdentNode("t"),
    newIdentNode("ii"),
    newLit(3)
  )
)
1.6.20 👎 FAIL

Output

Error: Command failed: nim c --run  -d:nimDebug -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints: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(4, 3) Error: undeclared identifier: 'ii'
candidates (edit distance, scope distance); see '--spellSuggest': 
 (1, 3): 'in' [template declared in /home/runner/.choosenim/toolchains/nim-1.6.20/lib/system.nim(825, 10)]
 (1, 3): 'io' [module declared in /home/runner/.choosenim/toolchains/nim-1.6.20/lib/system.nim(3131, 14)]
 (1, 3): 'is' [proc declared in /home/runner/.choosenim/toolchains/nim-1.6.20/lib/system.nim(838, 6)]
fatal.nim(54)            sysFatal
Error: unhandled exception: options.nim(662, 14) `false` errGenerated [AssertionDefect]

IR

Compiled filesize 0 bytes (0 bytes)

Stats

  • Started 2024-05-30T13:13:20
  • Finished 2024-05-30T13:13:20
  • Duration

AST

nnkStmtList.newTree(
  nnkTemplateDef.newTree(
    newIdentNode("t"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("n"),
        newIdentNode("float"),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkTemplateDef.newTree(
    newIdentNode("t"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("todecl"),
        newIdentNode("untyped"),
        newEmptyNode()
      ),
      nnkIdentDefs.newTree(
        newIdentNode("x"),
        newIdentNode("int"),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkCall.newTree(
    newIdentNode("t"),
    newIdentNode("ii"),
    newLit(3)
  )
)
1.4.8 👎 FAIL

Output

Error: Command failed: nim c --run  -d:nimDebug -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints: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(4, 3) Error: undeclared identifier: 'ii'

IR

Compiled filesize 0 bytes (0 bytes)

Stats

  • Started 2024-05-30T13:13:22
  • Finished 2024-05-30T13:13:23
  • Duration

AST

nnkStmtList.newTree(
  nnkTemplateDef.newTree(
    newIdentNode("t"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("n"),
        newIdentNode("float"),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkTemplateDef.newTree(
    newIdentNode("t"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("todecl"),
        newIdentNode("untyped"),
        newEmptyNode()
      ),
      nnkIdentDefs.newTree(
        newIdentNode("x"),
        newIdentNode("int"),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkCall.newTree(
    newIdentNode("t"),
    newIdentNode("ii"),
    newLit(3)
  )
)
1.2.18 👎 FAIL

Output

Error: Command failed: nim c --run  -d:nimDebug -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints: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(4, 3) Error: undeclared identifier: 'ii'

IR

Compiled filesize 0 bytes (0 bytes)

Stats

  • Started 2024-05-30T13:13:26
  • Finished 2024-05-30T13:13:26
  • Duration

AST

nnkStmtList.newTree(
  nnkTemplateDef.newTree(
    newIdentNode("t"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("n"),
        newIdentNode("float"),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkTemplateDef.newTree(
    newIdentNode("t"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("todecl"),
        newIdentNode("untyped"),
        newEmptyNode()
      ),
      nnkIdentDefs.newTree(
        newIdentNode("x"),
        newIdentNode("int"),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkCall.newTree(
    newIdentNode("t"),
    newIdentNode("ii"),
    newLit(3)
  )
)
1.0.10 👎 FAIL

Output

Error: Command failed: nim c --run  -d:nimDebug -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints: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(4, 3) Error: undeclared identifier: 'ii'

IR

Compiled filesize 0 bytes (0 bytes)

Stats

  • Started 2024-05-30T13:13:28
  • Finished 2024-05-30T13:13:28
  • Duration

AST

nnkStmtList.newTree(
  nnkTemplateDef.newTree(
    newIdentNode("t"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("n"),
        newIdentNode("float"),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkTemplateDef.newTree(
    newIdentNode("t"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("todecl"),
        newIdentNode("untyped"),
        newEmptyNode()
      ),
      nnkIdentDefs.newTree(
        newIdentNode("x"),
        newIdentNode("int"),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkCall.newTree(
    newIdentNode("t"),
    newIdentNode("ii"),
    newLit(3)
  )
)
Stats
  • GCC 11.4.0
  • Clang 14.0.0
  • NodeJS 20.3
  • Created 2024-05-30T13:12:41Z
  • Comments 1
  • Commands nim c --run -d:nimDebug -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints: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 8 commits at 0 commits per second

@juancarlospaco
Copy link
Collaborator

Same behaviour from 1.0 to devel. 🤷

@beef331
Copy link
Collaborator

beef331 commented May 31, 2024

This is required for dispatch, overloaded macros and templates have to semantically check arguments for a call in cases of ambiguity.

@metagn
Copy link
Collaborator

metagn commented May 31, 2024

nim-lang/RFCs#402

@litlighilit
Copy link
Contributor Author

Another workaround:

make the overloaded templates' param untyped, too.

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

No branches or pull requests

4 participants