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

Undeclared error when declaring a let via a template that takes some argument in a generic proc #21376

Open
gabbhack opened this issue Feb 15, 2023 · 3 comments

Comments

@gabbhack
Copy link

Description

template def(something: string): untyped {.dirty.} =
  let foo = "123"

proc test[T]() =
  def("123")
  echo foo

test[int]()

https://play.nim-lang.org/#ix=4o9W

Nim Version

Nim Compiler Version 1.6.10 [Windows: amd64]
Compiled at 2022-11-21
Copyright (c) 2006-2021 by Andreas Rumpf

active boot switches: -d:release

Current Output

Error: undeclared identifier: 'foo'

Expected Output

123

Possible Solution

No response

Additional Information

If test is non-generic it works

template def(something: string): untyped {.dirty.} =
  let foo = "123"

proc test() =
  def("123")
  echo foo

test()

If def accepts no args it works

template def(): untyped {.dirty.} =
  let foo = "123"

proc test[T]() =
  def()
  echo foo

test[int]()

If def accepts untyped argument and we use it as ident it works

template def(ident: untyped): untyped {.dirty.} =
  let ident = "123"

proc test[T]() =
  def(foo)
  echo foo

test[int]()

But if def takes something else, it does not work

template def(ident: untyped, something: string): untyped {.dirty.} =
  let ident = "123"

proc test[T]() =
  def(foo, "123")
  echo foo

test[int]()

Same for non-dirty

template def(ident: untyped, something: string): untyped =
  let ident = "123"

proc test[T]() =
  def(foo, "123")
  echo foo

test[int]()
template def(something: string): untyped =
  let foo {.inject.} = "123"

proc test[T]() =
  def("123")
  echo foo

test[int]()
@metagn
Copy link
Collaborator

metagn commented Feb 15, 2023

Reported on forum https://forum.nim-lang.org/t/9892, note also mixin foo in generic proc works

Related #5975

@juancarlospaco
Copy link
Collaborator

!nim c

template t0(s: string): untyped =
  let foo {.inject.} = "Z"
proc test0[T]() =
  t0("X")
  echo foo
test0[int]()

template t1(s: string): untyped {.dirty.} =
  let foo = "Y"
proc test1[T]() =
  t1("X")
  echo foo
test1[int]()

@github-actions
Copy link
Contributor

github-actions bot commented Jul 7, 2023

@juancarlospaco (contributor)

devel :-1: FAIL

Output

Error: Command failed: nim c --run -d:strip -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --threads: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(5, 8) Error: undeclared identifier: 'foo'

Stats

  • Created 2023-07-07T11:20:55Z
  • Started 2023-07-07T11:21:28
  • Finished 2023-07-07T11:21:28
  • Duration now
  • Commands nim c --run -d:strip -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --threads: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

IR

AST

nnkStmtList.newTree(
  nnkTemplateDef.newTree(
    newIdentNode("t0"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newIdentNode("untyped"),
      nnkIdentDefs.newTree(
        newIdentNode("s"),
        newIdentNode("string"),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkLetSection.newTree(
        nnkIdentDefs.newTree(
          nnkPragmaExpr.newTree(
            newIdentNode("foo"),
            nnkPragma.newTree(
              newIdentNode("inject")
            )
          ),
          newEmptyNode(),
          newLit("Z")
        )
      )
    )
  ),
  nnkProcDef.newTree(
    newIdentNode("test0"),
    newEmptyNode(),
    nnkGenericParams.newTree(
      nnkIdentDefs.newTree(
        newIdentNode("T"),
        newEmptyNode(),
        newEmptyNode()
      )
    ),
    nnkFormalParams.newTree(
      newEmptyNode()
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkCall.newTree(
        newIdentNode("t0"),
        newLit("X")
      ),
      nnkCommand.newTree(
        newIdentNode("echo"),
        newIdentNode("foo")
      )
    )
  ),
  nnkCall.newTree(
    nnkBracketExpr.newTree(
      newIdentNode("test0"),
      newIdentNode("int")
    )
  ),
  nnkTemplateDef.newTree(
    newIdentNode("t1"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newIdentNode("untyped"),
      nnkIdentDefs.newTree(
        newIdentNode("s"),
        newIdentNode("string"),
        newEmptyNode()
      )
    ),
    nnkPragma.newTree(
      newIdentNode("dirty")
    ),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkLetSection.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("foo"),
          newEmptyNode(),
          newLit("Y")
        )
      )
    )
  ),
  nnkProcDef.newTree(
    newIdentNode("test1"),
    newEmptyNode(),
    nnkGenericParams.newTree(
      nnkIdentDefs.newTree(
        newIdentNode("T"),
        newEmptyNode(),
        newEmptyNode()
      )
    ),
    nnkFormalParams.newTree(
      newEmptyNode()
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkCall.newTree(
        newIdentNode("t1"),
        newLit("X")
      ),
      nnkCommand.newTree(
        newIdentNode("echo"),
        newIdentNode("foo")
      )
    )
  ),
  nnkCall.newTree(
    nnkBracketExpr.newTree(
      newIdentNode("test1"),
      newIdentNode("int")
    )
  )
)
stable :-1: FAIL

Output

Error: Command failed: nim c --run -d:strip -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --threads: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(5, 8) Error: undeclared identifier: 'foo'

Stats

  • Created 2023-07-07T11:20:55Z
  • Started 2023-07-07T11:21:29
  • Finished 2023-07-07T11:21:29
  • Duration now
  • Commands nim c --run -d:strip -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --threads: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

IR

AST

nnkStmtList.newTree(
  nnkTemplateDef.newTree(
    newIdentNode("t0"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newIdentNode("untyped"),
      nnkIdentDefs.newTree(
        newIdentNode("s"),
        newIdentNode("string"),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkLetSection.newTree(
        nnkIdentDefs.newTree(
          nnkPragmaExpr.newTree(
            newIdentNode("foo"),
            nnkPragma.newTree(
              newIdentNode("inject")
            )
          ),
          newEmptyNode(),
          newLit("Z")
        )
      )
    )
  ),
  nnkProcDef.newTree(
    newIdentNode("test0"),
    newEmptyNode(),
    nnkGenericParams.newTree(
      nnkIdentDefs.newTree(
        newIdentNode("T"),
        newEmptyNode(),
        newEmptyNode()
      )
    ),
    nnkFormalParams.newTree(
      newEmptyNode()
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkCall.newTree(
        newIdentNode("t0"),
        newLit("X")
      ),
      nnkCommand.newTree(
        newIdentNode("echo"),
        newIdentNode("foo")
      )
    )
  ),
  nnkCall.newTree(
    nnkBracketExpr.newTree(
      newIdentNode("test0"),
      newIdentNode("int")
    )
  ),
  nnkTemplateDef.newTree(
    newIdentNode("t1"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newIdentNode("untyped"),
      nnkIdentDefs.newTree(
        newIdentNode("s"),
        newIdentNode("string"),
        newEmptyNode()
      )
    ),
    nnkPragma.newTree(
      newIdentNode("dirty")
    ),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkLetSection.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("foo"),
          newEmptyNode(),
          newLit("Y")
        )
      )
    )
  ),
  nnkProcDef.newTree(
    newIdentNode("test1"),
    newEmptyNode(),
    nnkGenericParams.newTree(
      nnkIdentDefs.newTree(
        newIdentNode("T"),
        newEmptyNode(),
        newEmptyNode()
      )
    ),
    nnkFormalParams.newTree(
      newEmptyNode()
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkCall.newTree(
        newIdentNode("t1"),
        newLit("X")
      ),
      nnkCommand.newTree(
        newIdentNode("echo"),
        newIdentNode("foo")
      )
    )
  ),
  nnkCall.newTree(
    nnkBracketExpr.newTree(
      newIdentNode("test1"),
      newIdentNode("int")
    )
  )
)
1.6.0 :-1: FAIL

Output

Error: Command failed: nim c --run -d:strip -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --threads: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(5, 8) Error: undeclared identifier: 'foo'

Stats

  • Created 2023-07-07T11:20:55Z
  • Started 2023-07-07T11:21:32
  • Finished 2023-07-07T11:21:32
  • Duration now
  • Commands nim c --run -d:strip -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --threads: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

IR

AST

nnkStmtList.newTree(
  nnkTemplateDef.newTree(
    newIdentNode("t0"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newIdentNode("untyped"),
      nnkIdentDefs.newTree(
        newIdentNode("s"),
        newIdentNode("string"),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkLetSection.newTree(
        nnkIdentDefs.newTree(
          nnkPragmaExpr.newTree(
            newIdentNode("foo"),
            nnkPragma.newTree(
              newIdentNode("inject")
            )
          ),
          newEmptyNode(),
          newLit("Z")
        )
      )
    )
  ),
  nnkProcDef.newTree(
    newIdentNode("test0"),
    newEmptyNode(),
    nnkGenericParams.newTree(
      nnkIdentDefs.newTree(
        newIdentNode("T"),
        newEmptyNode(),
        newEmptyNode()
      )
    ),
    nnkFormalParams.newTree(
      newEmptyNode()
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkCall.newTree(
        newIdentNode("t0"),
        newLit("X")
      ),
      nnkCommand.newTree(
        newIdentNode("echo"),
        newIdentNode("foo")
      )
    )
  ),
  nnkCall.newTree(
    nnkBracketExpr.newTree(
      newIdentNode("test0"),
      newIdentNode("int")
    )
  ),
  nnkTemplateDef.newTree(
    newIdentNode("t1"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newIdentNode("untyped"),
      nnkIdentDefs.newTree(
        newIdentNode("s"),
        newIdentNode("string"),
        newEmptyNode()
      )
    ),
    nnkPragma.newTree(
      newIdentNode("dirty")
    ),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkLetSection.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("foo"),
          newEmptyNode(),
          newLit("Y")
        )
      )
    )
  ),
  nnkProcDef.newTree(
    newIdentNode("test1"),
    newEmptyNode(),
    nnkGenericParams.newTree(
      nnkIdentDefs.newTree(
        newIdentNode("T"),
        newEmptyNode(),
        newEmptyNode()
      )
    ),
    nnkFormalParams.newTree(
      newEmptyNode()
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkCall.newTree(
        newIdentNode("t1"),
        newLit("X")
      ),
      nnkCommand.newTree(
        newIdentNode("echo"),
        newIdentNode("foo")
      )
    )
  ),
  nnkCall.newTree(
    nnkBracketExpr.newTree(
      newIdentNode("test1"),
      newIdentNode("int")
    )
  )
)
1.4.0 :-1: FAIL

Output

Error: Command failed: nim c --run -d:strip -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --threads: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(5, 8) Error: undeclared identifier: 'foo'

Stats

  • Created 2023-07-07T11:20:55Z
  • Started 2023-07-07T11:21:35
  • Finished 2023-07-07T11:21:35
  • Duration now
  • Commands nim c --run -d:strip -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --threads: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

IR

AST

nnkStmtList.newTree(
  nnkTemplateDef.newTree(
    newIdentNode("t0"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newIdentNode("untyped"),
      nnkIdentDefs.newTree(
        newIdentNode("s"),
        newIdentNode("string"),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkLetSection.newTree(
        nnkIdentDefs.newTree(
          nnkPragmaExpr.newTree(
            newIdentNode("foo"),
            nnkPragma.newTree(
              newIdentNode("inject")
            )
          ),
          newEmptyNode(),
          newLit("Z")
        )
      )
    )
  ),
  nnkProcDef.newTree(
    newIdentNode("test0"),
    newEmptyNode(),
    nnkGenericParams.newTree(
      nnkIdentDefs.newTree(
        newIdentNode("T"),
        newEmptyNode(),
        newEmptyNode()
      )
    ),
    nnkFormalParams.newTree(
      newEmptyNode()
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkCall.newTree(
        newIdentNode("t0"),
        newLit("X")
      ),
      nnkCommand.newTree(
        newIdentNode("echo"),
        newIdentNode("foo")
      )
    )
  ),
  nnkCall.newTree(
    nnkBracketExpr.newTree(
      newIdentNode("test0"),
      newIdentNode("int")
    )
  ),
  nnkTemplateDef.newTree(
    newIdentNode("t1"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newIdentNode("untyped"),
      nnkIdentDefs.newTree(
        newIdentNode("s"),
        newIdentNode("string"),
        newEmptyNode()
      )
    ),
    nnkPragma.newTree(
      newIdentNode("dirty")
    ),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkLetSection.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("foo"),
          newEmptyNode(),
          newLit("Y")
        )
      )
    )
  ),
  nnkProcDef.newTree(
    newIdentNode("test1"),
    newEmptyNode(),
    nnkGenericParams.newTree(
      nnkIdentDefs.newTree(
        newIdentNode("T"),
        newEmptyNode(),
        newEmptyNode()
      )
    ),
    nnkFormalParams.newTree(
      newEmptyNode()
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkCall.newTree(
        newIdentNode("t1"),
        newLit("X")
      ),
      nnkCommand.newTree(
        newIdentNode("echo"),
        newIdentNode("foo")
      )
    )
  ),
  nnkCall.newTree(
    nnkBracketExpr.newTree(
      newIdentNode("test1"),
      newIdentNode("int")
    )
  )
)
1.2.0 :-1: FAIL

Output

Error: Command failed: nim c --run -d:strip -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --threads: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(5, 8) Error: undeclared identifier: 'foo'

Stats

  • Created 2023-07-07T11:20:55Z
  • Started 2023-07-07T11:21:51
  • Finished 2023-07-07T11:21:51
  • Duration now
  • Commands nim c --run -d:strip -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --threads: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

IR

AST

nnkStmtList.newTree(
  nnkTemplateDef.newTree(
    newIdentNode("t0"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newIdentNode("untyped"),
      nnkIdentDefs.newTree(
        newIdentNode("s"),
        newIdentNode("string"),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkLetSection.newTree(
        nnkIdentDefs.newTree(
          nnkPragmaExpr.newTree(
            newIdentNode("foo"),
            nnkPragma.newTree(
              newIdentNode("inject")
            )
          ),
          newEmptyNode(),
          newLit("Z")
        )
      )
    )
  ),
  nnkProcDef.newTree(
    newIdentNode("test0"),
    newEmptyNode(),
    nnkGenericParams.newTree(
      nnkIdentDefs.newTree(
        newIdentNode("T"),
        newEmptyNode(),
        newEmptyNode()
      )
    ),
    nnkFormalParams.newTree(
      newEmptyNode()
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkCall.newTree(
        newIdentNode("t0"),
        newLit("X")
      ),
      nnkCommand.newTree(
        newIdentNode("echo"),
        newIdentNode("foo")
      )
    )
  ),
  nnkCall.newTree(
    nnkBracketExpr.newTree(
      newIdentNode("test0"),
      newIdentNode("int")
    )
  ),
  nnkTemplateDef.newTree(
    newIdentNode("t1"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newIdentNode("untyped"),
      nnkIdentDefs.newTree(
        newIdentNode("s"),
        newIdentNode("string"),
        newEmptyNode()
      )
    ),
    nnkPragma.newTree(
      newIdentNode("dirty")
    ),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkLetSection.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("foo"),
          newEmptyNode(),
          newLit("Y")
        )
      )
    )
  ),
  nnkProcDef.newTree(
    newIdentNode("test1"),
    newEmptyNode(),
    nnkGenericParams.newTree(
      nnkIdentDefs.newTree(
        newIdentNode("T"),
        newEmptyNode(),
        newEmptyNode()
      )
    ),
    nnkFormalParams.newTree(
      newEmptyNode()
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkCall.newTree(
        newIdentNode("t1"),
        newLit("X")
      ),
      nnkCommand.newTree(
        newIdentNode("echo"),
        newIdentNode("foo")
      )
    )
  ),
  nnkCall.newTree(
    nnkBracketExpr.newTree(
      newIdentNode("test1"),
      newIdentNode("int")
    )
  )
)
1.0.0 :-1: FAIL

Output

Error: Command failed: nim c --run -d:strip -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --threads: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(5, 8) Error: undeclared identifier: 'foo'

Stats

  • Created 2023-07-07T11:20:55Z
  • Started 2023-07-07T11:22:04
  • Finished 2023-07-07T11:22:04
  • Duration now
  • Commands nim c --run -d:strip -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --threads: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

IR

AST

nnkStmtList.newTree(
  nnkTemplateDef.newTree(
    newIdentNode("t0"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newIdentNode("untyped"),
      nnkIdentDefs.newTree(
        newIdentNode("s"),
        newIdentNode("string"),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkLetSection.newTree(
        nnkIdentDefs.newTree(
          nnkPragmaExpr.newTree(
            newIdentNode("foo"),
            nnkPragma.newTree(
              newIdentNode("inject")
            )
          ),
          newEmptyNode(),
          newLit("Z")
        )
      )
    )
  ),
  nnkProcDef.newTree(
    newIdentNode("test0"),
    newEmptyNode(),
    nnkGenericParams.newTree(
      nnkIdentDefs.newTree(
        newIdentNode("T"),
        newEmptyNode(),
        newEmptyNode()
      )
    ),
    nnkFormalParams.newTree(
      newEmptyNode()
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkCall.newTree(
        newIdentNode("t0"),
        newLit("X")
      ),
      nnkCommand.newTree(
        newIdentNode("echo"),
        newIdentNode("foo")
      )
    )
  ),
  nnkCall.newTree(
    nnkBracketExpr.newTree(
      newIdentNode("test0"),
      newIdentNode("int")
    )
  ),
  nnkTemplateDef.newTree(
    newIdentNode("t1"),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newIdentNode("untyped"),
      nnkIdentDefs.newTree(
        newIdentNode("s"),
        newIdentNode("string"),
        newEmptyNode()
      )
    ),
    nnkPragma.newTree(
      newIdentNode("dirty")
    ),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkLetSection.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("foo"),
          newEmptyNode(),
          newLit("Y")
        )
      )
    )
  ),
  nnkProcDef.newTree(
    newIdentNode("test1"),
    newEmptyNode(),
    nnkGenericParams.newTree(
      nnkIdentDefs.newTree(
        newIdentNode("T"),
        newEmptyNode(),
        newEmptyNode()
      )
    ),
    nnkFormalParams.newTree(
      newEmptyNode()
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkCall.newTree(
        newIdentNode("t1"),
        newLit("X")
      ),
      nnkCommand.newTree(
        newIdentNode("echo"),
        newIdentNode("foo")
      )
    )
  ),
  nnkCall.newTree(
    nnkBracketExpr.newTree(
      newIdentNode("test1"),
      newIdentNode("int")
    )
  )
)
🤖 Bug found in 40 minutes bisecting 6 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

3 participants