-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
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
Labels
Comments
Reported on forum https://forum.nim-lang.org/t/9892, note also Related #5975 |
!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]() |
@juancarlospaco (contributor) devel :-1: FAILOutput
Stats
IRASTnnkStmtList.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: FAILOutput
Stats
IRASTnnkStmtList.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: FAILOutput
Stats
IRASTnnkStmtList.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: FAILOutput
Stats
IRASTnnkStmtList.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: FAILOutput
Stats
IRASTnnkStmtList.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: FAILOutput
Stats
IRASTnnkStmtList.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")
)
)
) 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
Description
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
Expected Output
Possible Solution
No response
Additional Information
If
test
is non-generic it worksIf
def
accepts no args it worksIf
def
acceptsuntyped
argument and we use it as ident it worksBut if
def
takes something else, it does not workSame for non-dirty
The text was updated successfully, but these errors were encountered: