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

procedure parameter, with pragma inject, in branch when false, causes compiler error #23491

Open
rockcavera opened this issue Apr 10, 2024 · 2 comments

Comments

@rockcavera
Copy link
Contributor

rockcavera commented Apr 10, 2024

Description

Until a few days ago I thought it was related to #23326, but the correction for this came out and the error remains.

template test() =
  when false:
    proc procname(param {.inject.}: int) =
      discard param
  else:
    proc procname(param: int) =
      discard param

test()

Nim Version

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

git hash: 72d0ba2df534109064badde1a1b26ae53f22d44d
active boot switches: -d:release

Current Output

nim r bug
Hint: used config file 'E:\Nim\config\nim.cfg' [Conf]
Hint: used config file 'E:\Nim\config\config.nims' [Conf]
.......................................................................
C:\Users\josep\desktop\bug.nim(9, 5) template/generic instantiation of `test` from here
C:\Users\josep\desktop\bug.nim(7, 15) Error: undeclared identifier: 'param'
candidates (edit distance, scope distance); see '--spellSuggest':
 (3, 4): 'PFrame'
 (3, 4): 'TFrame'
 (3, 4): 'array'

Expected Output

compiles without error

Possible Solution

No response

Additional Information

No response

@juancarlospaco
Copy link
Collaborator

!nim c

template test() =
  when false:
    proc procname(param {.inject.}: int) =
      discard param
  else:
    proc procname(param: int) =
      discard param

test()

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(8, 5) template/generic instantiation of `test` from here
/home/runner/work/Nim/Nim/temp.nim(7, 15) Error: undeclared identifier: 'param'
candidates (edit distance, scope distance); see '--spellSuggest': 
 (3, 4): 'PFrame'
 (3, 4): 'TFrame'
 (3, 4): 'array'
assertions.nim(34)       raiseAssert
Error: unhandled exception: errGenerated [AssertionDefect]

IR

Compiled filesize 0 bytes (0 bytes)

Stats

  • Started 2024-04-10T14:26:07
  • Finished 2024-04-10T14:26:08
  • Duration

AST

nnkStmtList.newTree(
  nnkTemplateDef.newTree(
    newIdentNode("test"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newEmptyNode()
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkWhenStmt.newTree(
        nnkElifBranch.newTree(
          newIdentNode("false"),
          nnkStmtList.newTree(
            nnkProcDef.newTree(
              newIdentNode("procname"),
              newEmptyNode(),
              newEmptyNode(),
              nnkFormalParams.newTree(
                newEmptyNode(),
                nnkIdentDefs.newTree(
                  nnkPragmaExpr.newTree(
                    newIdentNode("param"),
                    nnkPragma.newTree(
                      newIdentNode("inject")
                    )
                  ),
                  newIdentNode("int"),
                  newEmptyNode()
                )
              ),
              newEmptyNode(),
              newEmptyNode(),
              nnkStmtList.newTree(
                nnkDiscardStmt.newTree(
                  newIdentNode("param")
                )
              )
            )
          )
        ),
        nnkElse.newTree(
          nnkStmtList.newTree(
            nnkProcDef.newTree(
              newIdentNode("procname"),
              newEmptyNode(),
              newEmptyNode(),
              nnkFormalParams.newTree(
                newEmptyNode(),
                nnkIdentDefs.newTree(
                  newIdentNode("param"),
                  newIdentNode("int"),
                  newEmptyNode()
                )
              ),
              newEmptyNode(),
              newEmptyNode(),
              nnkStmtList.newTree(
                nnkDiscardStmt.newTree(
                  newIdentNode("param")
                )
              )
            )
          )
        )
      )
    )
  ),
  nnkCall.newTree(
    newIdentNode("test")
  )
)
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(8, 5) template/generic instantiation of `test` from here
/home/runner/work/Nim/Nim/temp.nim(7, 15) Error: undeclared identifier: 'param'
candidates (edit distance, scope distance); see '--spellSuggest': 
 (3, 4): 'PFrame'
 (3, 4): 'TFrame'
 (3, 4): 'array'
assertions.nim(34)       raiseAssert
Error: unhandled exception: options.nim(681, 5) `false` errGenerated [AssertionDefect]

IR

Compiled filesize 0 bytes (0 bytes)

Stats

  • Started 2024-04-10T14:26:08
  • Finished 2024-04-10T14:26:08
  • Duration

AST

nnkStmtList.newTree(
  nnkTemplateDef.newTree(
    newIdentNode("test"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newEmptyNode()
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkWhenStmt.newTree(
        nnkElifBranch.newTree(
          newIdentNode("false"),
          nnkStmtList.newTree(
            nnkProcDef.newTree(
              newIdentNode("procname"),
              newEmptyNode(),
              newEmptyNode(),
              nnkFormalParams.newTree(
                newEmptyNode(),
                nnkIdentDefs.newTree(
                  nnkPragmaExpr.newTree(
                    newIdentNode("param"),
                    nnkPragma.newTree(
                      newIdentNode("inject")
                    )
                  ),
                  newIdentNode("int"),
                  newEmptyNode()
                )
              ),
              newEmptyNode(),
              newEmptyNode(),
              nnkStmtList.newTree(
                nnkDiscardStmt.newTree(
                  newIdentNode("param")
                )
              )
            )
          )
        ),
        nnkElse.newTree(
          nnkStmtList.newTree(
            nnkProcDef.newTree(
              newIdentNode("procname"),
              newEmptyNode(),
              newEmptyNode(),
              nnkFormalParams.newTree(
                newEmptyNode(),
                nnkIdentDefs.newTree(
                  newIdentNode("param"),
                  newIdentNode("int"),
                  newEmptyNode()
                )
              ),
              newEmptyNode(),
              newEmptyNode(),
              nnkStmtList.newTree(
                nnkDiscardStmt.newTree(
                  newIdentNode("param")
                )
              )
            )
          )
        )
      )
    )
  ),
  nnkCall.newTree(
    newIdentNode("test")
  )
)
2.0.2 👎 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, 5) template/generic instantiation of `test` from here
/home/runner/work/Nim/Nim/temp.nim(7, 15) Error: undeclared identifier: 'param'
candidates (edit distance, scope distance); see '--spellSuggest': 
 (3, 4): 'PFrame'
 (3, 4): 'TFrame'
 (3, 4): 'array'
assertions.nim(34)       raiseAssert
Error: unhandled exception: options.nim(681, 5) `false` errGenerated [AssertionDefect]

IR

Compiled filesize 0 bytes (0 bytes)

Stats

  • Started 2024-04-10T14:26:09
  • Finished 2024-04-10T14:26:09
  • Duration

AST

nnkStmtList.newTree(
  nnkTemplateDef.newTree(
    newIdentNode("test"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newEmptyNode()
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkWhenStmt.newTree(
        nnkElifBranch.newTree(
          newIdentNode("false"),
          nnkStmtList.newTree(
            nnkProcDef.newTree(
              newIdentNode("procname"),
              newEmptyNode(),
              newEmptyNode(),
              nnkFormalParams.newTree(
                newEmptyNode(),
                nnkIdentDefs.newTree(
                  nnkPragmaExpr.newTree(
                    newIdentNode("param"),
                    nnkPragma.newTree(
                      newIdentNode("inject")
                    )
                  ),
                  newIdentNode("int"),
                  newEmptyNode()
                )
              ),
              newEmptyNode(),
              newEmptyNode(),
              nnkStmtList.newTree(
                nnkDiscardStmt.newTree(
                  newIdentNode("param")
                )
              )
            )
          )
        ),
        nnkElse.newTree(
          nnkStmtList.newTree(
            nnkProcDef.newTree(
              newIdentNode("procname"),
              newEmptyNode(),
              newEmptyNode(),
              nnkFormalParams.newTree(
                newEmptyNode(),
                nnkIdentDefs.newTree(
                  newIdentNode("param"),
                  newIdentNode("int"),
                  newEmptyNode()
                )
              ),
              newEmptyNode(),
              newEmptyNode(),
              nnkStmtList.newTree(
                nnkDiscardStmt.newTree(
                  newIdentNode("param")
                )
              )
            )
          )
        )
      )
    )
  ),
  nnkCall.newTree(
    newIdentNode("test")
  )
)
1.6.14 👎 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, 5) template/generic instantiation of `test` from here
/home/runner/work/Nim/Nim/temp.nim(7, 15) Error: undeclared identifier: 'param'
candidates (edit distance, scope distance); see '--spellSuggest': 
 (3, 4): 'PFrame' [type declared in /home/runner/.choosenim/toolchains/nim-1.6.14/lib/system.nim(1971, 3)]
 (3, 4): 'TFrame' [type declared in /home/runner/.choosenim/toolchains/nim-1.6.14/lib/system.nim(1974, 3)]
 (3, 4): 'array' [type declared in /home/runner/.choosenim/toolchains/nim-1.6.14/lib/system.nim(292, 3)]
 (3, 4): 'card' [func declared in /home/runner/.choosenim/toolchains/nim-1.6.14/lib/system/setops.nim(39, 6)]
 (3, 4): 'pairs' [iterator declared in /home/runner/.choosenim/toolchains/nim-1.6.14/lib/system/iterators.nim(132, 10)]
 (3, 4): 'pairs' [iterator declared in /home/runner/.choosenim/toolchains/nim-1.6.14/lib/system/iterators.nim(147, 10)]
 (3, 4): 'pairs' [iterator declared in /home/runner/.choosenim/toolchains/nim-1.6.14/lib/system/iterators.nim(166, 10)]
 (3, 4): 'pairs' [iterator declared in /home/runner/.choosenim/toolchains/nim-1.6.14/lib/system/iterators.nim(185, 10)]
 (3, 4): 'pairs' [iterator declared in /home/runner/.choosenim/toolchains/nim-1.6.14/lib/system/iterators.nim(204, 10)]
 (3, 4): 'pred' [proc declared in /home/runner/.choosenim/toolchains/nim-1.6.14/lib/system/arithmetics.nim(10, 6)]
 (3, 4): 'ptr' [type declared in /home/runner/.choosenim/toolchains/nim-1.6.14/lib/system.nim(42, 3)]
fatal.nim(54)            sysFatal
Error: unhandled exception: options.nim(645, 14) `false` errGenerated [AssertionDefect]

IR

Compiled filesize 0 bytes (0 bytes)

Stats

  • Started 2024-04-10T14:26:12
  • Finished 2024-04-10T14:26:12
  • Duration

AST

nnkStmtList.newTree(
  nnkTemplateDef.newTree(
    newIdentNode("test"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newEmptyNode()
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkWhenStmt.newTree(
        nnkElifBranch.newTree(
          newIdentNode("false"),
          nnkStmtList.newTree(
            nnkProcDef.newTree(
              newIdentNode("procname"),
              newEmptyNode(),
              newEmptyNode(),
              nnkFormalParams.newTree(
                newEmptyNode(),
                nnkIdentDefs.newTree(
                  nnkPragmaExpr.newTree(
                    newIdentNode("param"),
                    nnkPragma.newTree(
                      newIdentNode("inject")
                    )
                  ),
                  newIdentNode("int"),
                  newEmptyNode()
                )
              ),
              newEmptyNode(),
              newEmptyNode(),
              nnkStmtList.newTree(
                nnkDiscardStmt.newTree(
                  newIdentNode("param")
                )
              )
            )
          )
        ),
        nnkElse.newTree(
          nnkStmtList.newTree(
            nnkProcDef.newTree(
              newIdentNode("procname"),
              newEmptyNode(),
              newEmptyNode(),
              nnkFormalParams.newTree(
                newEmptyNode(),
                nnkIdentDefs.newTree(
                  newIdentNode("param"),
                  newIdentNode("int"),
                  newEmptyNode()
                )
              ),
              newEmptyNode(),
              newEmptyNode(),
              nnkStmtList.newTree(
                nnkDiscardStmt.newTree(
                  newIdentNode("param")
                )
              )
            )
          )
        )
      )
    )
  ),
  nnkCall.newTree(
    newIdentNode("test")
  )
)
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(8, 5) template/generic instantiation of `test` from here
/home/runner/work/Nim/Nim/temp.nim(7, 15) Error: undeclared identifier: 'param'

IR

Compiled filesize 0 bytes (0 bytes)

Stats

  • Started 2024-04-10T14:26:14
  • Finished 2024-04-10T14:26:14
  • Duration

AST

nnkStmtList.newTree(
  nnkTemplateDef.newTree(
    newIdentNode("test"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newEmptyNode()
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkWhenStmt.newTree(
        nnkElifBranch.newTree(
          newIdentNode("false"),
          nnkStmtList.newTree(
            nnkProcDef.newTree(
              newIdentNode("procname"),
              newEmptyNode(),
              newEmptyNode(),
              nnkFormalParams.newTree(
                newEmptyNode(),
                nnkIdentDefs.newTree(
                  nnkPragmaExpr.newTree(
                    newIdentNode("param"),
                    nnkPragma.newTree(
                      newIdentNode("inject")
                    )
                  ),
                  newIdentNode("int"),
                  newEmptyNode()
                )
              ),
              newEmptyNode(),
              newEmptyNode(),
              nnkStmtList.newTree(
                nnkDiscardStmt.newTree(
                  newIdentNode("param")
                )
              )
            )
          )
        ),
        nnkElse.newTree(
          nnkStmtList.newTree(
            nnkProcDef.newTree(
              newIdentNode("procname"),
              newEmptyNode(),
              newEmptyNode(),
              nnkFormalParams.newTree(
                newEmptyNode(),
                nnkIdentDefs.newTree(
                  newIdentNode("param"),
                  newIdentNode("int"),
                  newEmptyNode()
                )
              ),
              newEmptyNode(),
              newEmptyNode(),
              nnkStmtList.newTree(
                nnkDiscardStmt.newTree(
                  newIdentNode("param")
                )
              )
            )
          )
        )
      )
    )
  ),
  nnkCall.newTree(
    newIdentNode("test")
  )
)
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(8, 5) template/generic instantiation of `test` from here
/home/runner/work/Nim/Nim/temp.nim(7, 15) Error: undeclared identifier: 'param'

IR

Compiled filesize 0 bytes (0 bytes)

Stats

  • Started 2024-04-10T14:26:17
  • Finished 2024-04-10T14:26:17
  • Duration

AST

nnkStmtList.newTree(
  nnkTemplateDef.newTree(
    newIdentNode("test"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newEmptyNode()
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkWhenStmt.newTree(
        nnkElifBranch.newTree(
          newIdentNode("false"),
          nnkStmtList.newTree(
            nnkProcDef.newTree(
              newIdentNode("procname"),
              newEmptyNode(),
              newEmptyNode(),
              nnkFormalParams.newTree(
                newEmptyNode(),
                nnkIdentDefs.newTree(
                  nnkPragmaExpr.newTree(
                    newIdentNode("param"),
                    nnkPragma.newTree(
                      newIdentNode("inject")
                    )
                  ),
                  newIdentNode("int"),
                  newEmptyNode()
                )
              ),
              newEmptyNode(),
              newEmptyNode(),
              nnkStmtList.newTree(
                nnkDiscardStmt.newTree(
                  newIdentNode("param")
                )
              )
            )
          )
        ),
        nnkElse.newTree(
          nnkStmtList.newTree(
            nnkProcDef.newTree(
              newIdentNode("procname"),
              newEmptyNode(),
              newEmptyNode(),
              nnkFormalParams.newTree(
                newEmptyNode(),
                nnkIdentDefs.newTree(
                  newIdentNode("param"),
                  newIdentNode("int"),
                  newEmptyNode()
                )
              ),
              newEmptyNode(),
              newEmptyNode(),
              nnkStmtList.newTree(
                nnkDiscardStmt.newTree(
                  newIdentNode("param")
                )
              )
            )
          )
        )
      )
    )
  ),
  nnkCall.newTree(
    newIdentNode("test")
  )
)
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(8, 5) template/generic instantiation of `test` from here
/home/runner/work/Nim/Nim/temp.nim(7, 15) Error: undeclared identifier: 'param'

IR

Compiled filesize 0 bytes (0 bytes)

Stats

  • Started 2024-04-10T14:26:20
  • Finished 2024-04-10T14:26:20
  • Duration

AST

nnkStmtList.newTree(
  nnkTemplateDef.newTree(
    newIdentNode("test"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newEmptyNode()
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkWhenStmt.newTree(
        nnkElifBranch.newTree(
          newIdentNode("false"),
          nnkStmtList.newTree(
            nnkProcDef.newTree(
              newIdentNode("procname"),
              newEmptyNode(),
              newEmptyNode(),
              nnkFormalParams.newTree(
                newEmptyNode(),
                nnkIdentDefs.newTree(
                  nnkPragmaExpr.newTree(
                    newIdentNode("param"),
                    nnkPragma.newTree(
                      newIdentNode("inject")
                    )
                  ),
                  newIdentNode("int"),
                  newEmptyNode()
                )
              ),
              newEmptyNode(),
              newEmptyNode(),
              nnkStmtList.newTree(
                nnkDiscardStmt.newTree(
                  newIdentNode("param")
                )
              )
            )
          )
        ),
        nnkElse.newTree(
          nnkStmtList.newTree(
            nnkProcDef.newTree(
              newIdentNode("procname"),
              newEmptyNode(),
              newEmptyNode(),
              nnkFormalParams.newTree(
                newEmptyNode(),
                nnkIdentDefs.newTree(
                  newIdentNode("param"),
                  newIdentNode("int"),
                  newEmptyNode()
                )
              ),
              newEmptyNode(),
              newEmptyNode(),
              nnkStmtList.newTree(
                nnkDiscardStmt.newTree(
                  newIdentNode("param")
                )
              )
            )
          )
        )
      )
    )
  ),
  nnkCall.newTree(
    newIdentNode("test")
  )
)
Stats
  • GCC 11.4.0
  • Clang 14.0.0
  • NodeJS 20.1
  • Created 2024-04-10T14:25:39Z
  • 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 16 minutes bisecting 7 commits at 0 commits per second

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

2 participants