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

when nimvm doesn't isolate symbols #23687

Open arnetheduck opened 3 weeks ago

arnetheduck commented 3 weeks ago

Description

when nimvm:
  proc mytest(a: int) =
    echo a
else:
  template mytest(a: int) =
    echo a + 42

proc xxx() =
  mytest(100)

the vm symbol shouldn't be visible outside of the when.

Nim Version

1.6, 2.0

Current Output

ambiguous call; both testit.mytest(a: int) [proc declared in testit.nim(2, 8)] and testit.mytest(a: int) [template declared in testit.nim(5, 12)] match for: (int literal(100))

Expected Output

No response

Possible Solution

No response

Additional Information

No response

juancarlospaco commented 3 weeks ago

!nim c

when nimvm:
  proc mytest(a: int) =
    echo a
else:
  template mytest(a: int) =
    echo a + 42

proc xxx() =
  mytest(100)
github-actions[bot] commented 3 weeks ago
:penguin: Linux bisect by @juancarlospaco (collaborator)
devel :-1: 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(8, 9) Error: ambiguous call; both temp.mytest(a: int) [proc declared in /home/runner/work/Nim/Nim/temp.nim(2, 8)] and temp.mytest(a: int) [template declared in /home/runner/work/Nim/Nim/temp.nim(5, 12)] match for: (int literal(100)) assertions.nim(34) raiseAssert Error: unhandled exception: errGenerated [AssertionDefect] ```

IR

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

Stats

  • Started 2024-06-06T20:02:12
  • Finished 2024-06-06T20:02:13
  • Duration

AST

```nim nnkStmtList.newTree( nnkWhenStmt.newTree( nnkElifBranch.newTree( newIdentNode("nimvm"), nnkStmtList.newTree( nnkProcDef.newTree( newIdentNode("mytest"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("a"), newIdentNode("int"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("echo"), newIdentNode("a") ) ) ) ) ), nnkElse.newTree( nnkStmtList.newTree( nnkTemplateDef.newTree( newIdentNode("mytest"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("a"), newIdentNode("int"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("echo"), nnkInfix.newTree( newIdentNode("+"), newIdentNode("a"), newLit(42) ) ) ) ) ) ) ), nnkProcDef.newTree( newIdentNode("xxx"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode() ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCall.newTree( newIdentNode("mytest"), newLit(100) ) ) ) ) ```
stable :-1: 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(8, 9) Error: ambiguous call; both temp.mytest(a: int) [proc declared in /home/runner/work/Nim/Nim/temp.nim(2, 8)] and temp.mytest(a: int) [template declared in /home/runner/work/Nim/Nim/temp.nim(5, 12)] match for: (int literal(100)) assertions.nim(34) raiseAssert Error: unhandled exception: options.nim(681, 5) `false` errGenerated [AssertionDefect] ```

IR

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

Stats

  • Started 2024-06-06T20:02:14
  • Finished 2024-06-06T20:02:14
  • Duration

AST

```nim nnkStmtList.newTree( nnkWhenStmt.newTree( nnkElifBranch.newTree( newIdentNode("nimvm"), nnkStmtList.newTree( nnkProcDef.newTree( newIdentNode("mytest"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("a"), newIdentNode("int"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("echo"), newIdentNode("a") ) ) ) ) ), nnkElse.newTree( nnkStmtList.newTree( nnkTemplateDef.newTree( newIdentNode("mytest"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("a"), newIdentNode("int"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("echo"), nnkInfix.newTree( newIdentNode("+"), newIdentNode("a"), newLit(42) ) ) ) ) ) ) ), nnkProcDef.newTree( newIdentNode("xxx"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode() ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCall.newTree( newIdentNode("mytest"), newLit(100) ) ) ) ) ```
2.0.4 :-1: 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(8, 9) Error: ambiguous call; both temp.mytest(a: int) [proc declared in /home/runner/work/Nim/Nim/temp.nim(2, 8)] and temp.mytest(a: int) [template declared in /home/runner/work/Nim/Nim/temp.nim(5, 12)] match for: (int literal(100)) assertions.nim(34) raiseAssert Error: unhandled exception: options.nim(681, 5) `false` errGenerated [AssertionDefect] ```

IR

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

Stats

  • Started 2024-06-06T20:02:15
  • Finished 2024-06-06T20:02:15
  • Duration

AST

```nim nnkStmtList.newTree( nnkWhenStmt.newTree( nnkElifBranch.newTree( newIdentNode("nimvm"), nnkStmtList.newTree( nnkProcDef.newTree( newIdentNode("mytest"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("a"), newIdentNode("int"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("echo"), newIdentNode("a") ) ) ) ) ), nnkElse.newTree( nnkStmtList.newTree( nnkTemplateDef.newTree( newIdentNode("mytest"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("a"), newIdentNode("int"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("echo"), nnkInfix.newTree( newIdentNode("+"), newIdentNode("a"), newLit(42) ) ) ) ) ) ) ), nnkProcDef.newTree( newIdentNode("xxx"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode() ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCall.newTree( newIdentNode("mytest"), newLit(100) ) ) ) ) ```
2.0.0 :-1: 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(8, 9) Error: ambiguous call; both temp.mytest(a: int) [proc declared in /home/runner/work/Nim/Nim/temp.nim(2, 8)] and temp.mytest(a: int) [template declared in /home/runner/work/Nim/Nim/temp.nim(5, 12)] match for: (int literal(100)) assertions.nim(34) raiseAssert Error: unhandled exception: options.nim(664, 5) `false` errGenerated [AssertionDefect] ```

IR

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

Stats

  • Started 2024-06-06T20:02:18
  • Finished 2024-06-06T20:02:19
  • Duration

AST

```nim nnkStmtList.newTree( nnkWhenStmt.newTree( nnkElifBranch.newTree( newIdentNode("nimvm"), nnkStmtList.newTree( nnkProcDef.newTree( newIdentNode("mytest"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("a"), newIdentNode("int"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("echo"), newIdentNode("a") ) ) ) ) ), nnkElse.newTree( nnkStmtList.newTree( nnkTemplateDef.newTree( newIdentNode("mytest"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("a"), newIdentNode("int"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("echo"), nnkInfix.newTree( newIdentNode("+"), newIdentNode("a"), newLit(42) ) ) ) ) ) ) ), nnkProcDef.newTree( newIdentNode("xxx"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode() ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCall.newTree( newIdentNode("mytest"), newLit(100) ) ) ) ) ```
1.6.20 :-1: 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(8, 9) Error: ambiguous call; both temp.mytest(a: int) [proc declared in /home/runner/work/Nim/Nim/temp.nim(2, 8)] and temp.mytest(a: int) [template declared in /home/runner/work/Nim/Nim/temp.nim(5, 12)] match for: (int literal(100)) fatal.nim(54) sysFatal Error: unhandled exception: options.nim(662, 14) `false` errGenerated [AssertionDefect] ```

IR

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

Stats

  • Started 2024-06-06T20:02:22
  • Finished 2024-06-06T20:02:22
  • Duration

AST

```nim nnkStmtList.newTree( nnkWhenStmt.newTree( nnkElifBranch.newTree( newIdentNode("nimvm"), nnkStmtList.newTree( nnkProcDef.newTree( newIdentNode("mytest"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("a"), newIdentNode("int"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("echo"), newIdentNode("a") ) ) ) ) ), nnkElse.newTree( nnkStmtList.newTree( nnkTemplateDef.newTree( newIdentNode("mytest"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("a"), newIdentNode("int"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("echo"), nnkInfix.newTree( newIdentNode("+"), newIdentNode("a"), newLit(42) ) ) ) ) ) ) ), nnkProcDef.newTree( newIdentNode("xxx"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode() ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCall.newTree( newIdentNode("mytest"), newLit(100) ) ) ) ) ```
1.4.8 :-1: 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(8, 9) Error: ambiguous call; both temp.mytest(a: int) [declared in /home/runner/work/Nim/Nim/temp.nim(2, 8)] and temp.mytest(a: int) [declared in /home/runner/work/Nim/Nim/temp.nim(5, 12)] match for: (int literal(100)) ```

IR

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

Stats

  • Started 2024-06-06T20:02:25
  • Finished 2024-06-06T20:02:25
  • Duration

AST

```nim nnkStmtList.newTree( nnkWhenStmt.newTree( nnkElifBranch.newTree( newIdentNode("nimvm"), nnkStmtList.newTree( nnkProcDef.newTree( newIdentNode("mytest"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("a"), newIdentNode("int"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("echo"), newIdentNode("a") ) ) ) ) ), nnkElse.newTree( nnkStmtList.newTree( nnkTemplateDef.newTree( newIdentNode("mytest"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("a"), newIdentNode("int"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("echo"), nnkInfix.newTree( newIdentNode("+"), newIdentNode("a"), newLit(42) ) ) ) ) ) ) ), nnkProcDef.newTree( newIdentNode("xxx"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode() ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCall.newTree( newIdentNode("mytest"), newLit(100) ) ) ) ) ```
1.2.18 :-1: 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(8, 9) Error: ambiguous call; both temp.mytest(a: int) [declared in /home/runner/work/Nim/Nim/temp.nim(2, 8)] and temp.mytest(a: int) [declared in /home/runner/work/Nim/Nim/temp.nim(5, 12)] match for: (int literal(100)) ```

IR

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

Stats

  • Started 2024-06-06T20:02:28
  • Finished 2024-06-06T20:02:29
  • Duration

AST

```nim nnkStmtList.newTree( nnkWhenStmt.newTree( nnkElifBranch.newTree( newIdentNode("nimvm"), nnkStmtList.newTree( nnkProcDef.newTree( newIdentNode("mytest"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("a"), newIdentNode("int"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("echo"), newIdentNode("a") ) ) ) ) ), nnkElse.newTree( nnkStmtList.newTree( nnkTemplateDef.newTree( newIdentNode("mytest"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("a"), newIdentNode("int"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("echo"), nnkInfix.newTree( newIdentNode("+"), newIdentNode("a"), newLit(42) ) ) ) ) ) ) ), nnkProcDef.newTree( newIdentNode("xxx"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode() ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCall.newTree( newIdentNode("mytest"), newLit(100) ) ) ) ) ```
1.0.10 :-1: 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(8, 9) Error: ambiguous call; both temp.mytest(a: int) [declared in /home/runner/work/Nim/Nim/temp.nim(2, 8)] and temp.mytest(a: int) [declared in /home/runner/work/Nim/Nim/temp.nim(5, 12)] match for: (int literal(100)) ```

IR

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

Stats

  • Started 2024-06-06T20:02:31
  • Finished 2024-06-06T20:02:31
  • Duration

AST

```nim nnkStmtList.newTree( nnkWhenStmt.newTree( nnkElifBranch.newTree( newIdentNode("nimvm"), nnkStmtList.newTree( nnkProcDef.newTree( newIdentNode("mytest"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("a"), newIdentNode("int"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("echo"), newIdentNode("a") ) ) ) ) ), nnkElse.newTree( nnkStmtList.newTree( nnkTemplateDef.newTree( newIdentNode("mytest"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("a"), newIdentNode("int"), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCommand.newTree( newIdentNode("echo"), nnkInfix.newTree( newIdentNode("+"), newIdentNode("a"), newLit(42) ) ) ) ) ) ) ), nnkProcDef.newTree( newIdentNode("xxx"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode() ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCall.newTree( newIdentNode("mytest"), newLit(100) ) ) ) ) ```
Stats
  • GCC 11.4.0
  • Clang 14.0.0
  • NodeJS 20.3
  • Created 2024-06-06T20:01:37Z
  • 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

:robot: Bug found in 22 minutes bisecting 8 commits at 0 commits per second

litlighilit commented 3 weeks ago

The issues about when nimvm caused symbol-lookup error

ref

21687

may ref

13450 #19869