`int128.nim(71, 11) arg.sdata(2) == 0 out of range [AssertionDefect]` returning array from generic `proc` at compiletime
Description
proc y[N](): array[N, int] = default(array[N, int])
discard y[1]()
nim c -c suffices, i.e. this is a compile-time, not runtime phenomenon.
Nim Version
Nim Compiler Version 1.6.19 [Linux: amd64]
Compiled at 2024-01-12
Copyright (c) 2006-2023 by Andreas Rumpf
git hash: 0f97dd6fb322b5902d1012a2e5a233d021361bc6
active boot switches: -d:release
Nim Compiler Version 2.0.3 [Linux: amd64]
Compiled at 2024-01-12
Copyright (c) 2006-2023 by Andreas Rumpf
git hash: 4bc305db1ee52464c917125a2f619a1bf0f08775
active boot switches: -d:release
Nim Compiler Version 2.1.1 [Linux: amd64]
Compiled at 2024-01-12
Copyright (c) 2006-2024 by Andreas Rumpf
git hash: 30cb6826c01d880b852b56e0d0d69e79a2105115
active boot switches: -d:release
Current Output
Error: unhandled exception: int128.nim(71, 11) `arg.sdata(2) == 0` out of range [AssertionDefect]
Expected Output
No compilation assert
Possible Solution
No response
Additional Information
No response
!nim c
proc y[N](): array[N, int] = default(array[N, int])
discard y[1]()
:penguin: Linux bisect by @ringabout (member)
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
assertions.nim(34) raiseAssert
Error: unhandled exception: int128.nim(71, 11) `arg.sdata(2) == 0` out of range [AssertionDefect]
IR
Compiled filesize0 bytes (0 bytes)
Stats
- Started
2024-01-12T13:33:53 - Finished
2024-01-12T13:33:54 - Duration
AST
nnkStmtList.newTree(
nnkProcDef.newTree(
newIdentNode("y"),
newEmptyNode(),
nnkGenericParams.newTree(
nnkIdentDefs.newTree(
newIdentNode("N"),
newEmptyNode(),
newEmptyNode()
)
),
nnkFormalParams.newTree(
nnkBracketExpr.newTree(
newIdentNode("array"),
newIdentNode("N"),
newIdentNode("int")
)
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkCall.newTree(
newIdentNode("default"),
nnkBracketExpr.newTree(
newIdentNode("array"),
newIdentNode("N"),
newIdentNode("int")
)
)
)
),
nnkDiscardStmt.newTree(
nnkCall.newTree(
nnkBracketExpr.newTree(
newIdentNode("y"),
newLit(1)
)
)
)
)
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
assertions.nim(34) raiseAssert
Error: unhandled exception: int128.nim(70, 11) `arg.sdata(2) == 0` out of range [AssertionDefect]
IR
Compiled filesize0 bytes (0 bytes)
Stats
- Started
2024-01-12T13:33:54 - Finished
2024-01-12T13:33:54 - Duration
AST
nnkStmtList.newTree(
nnkProcDef.newTree(
newIdentNode("y"),
newEmptyNode(),
nnkGenericParams.newTree(
nnkIdentDefs.newTree(
newIdentNode("N"),
newEmptyNode(),
newEmptyNode()
)
),
nnkFormalParams.newTree(
nnkBracketExpr.newTree(
newIdentNode("array"),
newIdentNode("N"),
newIdentNode("int")
)
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkCall.newTree(
newIdentNode("default"),
nnkBracketExpr.newTree(
newIdentNode("array"),
newIdentNode("N"),
newIdentNode("int")
)
)
)
),
nnkDiscardStmt.newTree(
nnkCall.newTree(
nnkBracketExpr.newTree(
newIdentNode("y"),
newLit(1)
)
)
)
)
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
assertions.nim(34) raiseAssert
Error: unhandled exception: int128.nim(70, 11) `arg.sdata(2) == 0` out of range [AssertionDefect]
IR
Compiled filesize0 bytes (0 bytes)
Stats
- Started
2024-01-12T13:33:57 - Finished
2024-01-12T13:33:57 - Duration
AST
nnkStmtList.newTree(
nnkProcDef.newTree(
newIdentNode("y"),
newEmptyNode(),
nnkGenericParams.newTree(
nnkIdentDefs.newTree(
newIdentNode("N"),
newEmptyNode(),
newEmptyNode()
)
),
nnkFormalParams.newTree(
nnkBracketExpr.newTree(
newIdentNode("array"),
newIdentNode("N"),
newIdentNode("int")
)
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkCall.newTree(
newIdentNode("default"),
nnkBracketExpr.newTree(
newIdentNode("array"),
newIdentNode("N"),
newIdentNode("int")
)
)
)
),
nnkDiscardStmt.newTree(
nnkCall.newTree(
nnkBracketExpr.newTree(
newIdentNode("y"),
newLit(1)
)
)
)
)
1.6.14 :-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
fatal.nim(54) sysFatal
Error: unhandled exception: int128.nim(72, 11) `arg.sdata(2) == 0` out of range [AssertionDefect]
IR
Compiled filesize0 bytes (0 bytes)
Stats
- Started
2024-01-12T13:33:59 - Finished
2024-01-12T13:34:00 - Duration
AST
nnkStmtList.newTree(
nnkProcDef.newTree(
newIdentNode("y"),
newEmptyNode(),
nnkGenericParams.newTree(
nnkIdentDefs.newTree(
newIdentNode("N"),
newEmptyNode(),
newEmptyNode()
)
),
nnkFormalParams.newTree(
nnkBracketExpr.newTree(
newIdentNode("array"),
newIdentNode("N"),
newIdentNode("int")
)
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkCall.newTree(
newIdentNode("default"),
nnkBracketExpr.newTree(
newIdentNode("array"),
newIdentNode("N"),
newIdentNode("int")
)
)
)
),
nnkDiscardStmt.newTree(
nnkCall.newTree(
nnkBracketExpr.newTree(
newIdentNode("y"),
newLit(1)
)
)
)
)
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
fatal.nim(49) sysFatal
Error: unhandled exception: int128.nim(72, 11) `arg.sdata(2) == 0` out of range [AssertionDefect]
IR
Compiled filesize0 bytes (0 bytes)
Stats
- Started
2024-01-12T13:34:02 - Finished
2024-01-12T13:34:02 - Duration
AST
nnkStmtList.newTree(
nnkProcDef.newTree(
newIdentNode("y"),
newEmptyNode(),
nnkGenericParams.newTree(
nnkIdentDefs.newTree(
newIdentNode("N"),
newEmptyNode(),
newEmptyNode()
)
),
nnkFormalParams.newTree(
nnkBracketExpr.newTree(
newIdentNode("array"),
newIdentNode("N"),
newIdentNode("int")
)
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkCall.newTree(
newIdentNode("default"),
nnkBracketExpr.newTree(
newIdentNode("array"),
newIdentNode("N"),
newIdentNode("int")
)
)
)
),
nnkDiscardStmt.newTree(
nnkCall.newTree(
nnkBracketExpr.newTree(
newIdentNode("y"),
newLit(1)
)
)
)
)
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
fatal.nim(49) sysFatal
Error: unhandled exception: int128.nim(72, 11) `arg.sdata(2) == 0` out of range [AssertionError]
IR
Compiled filesize0 bytes (0 bytes)
Stats
- Started
2024-01-12T13:34:04 - Finished
2024-01-12T13:34:04 - Duration
AST
nnkStmtList.newTree(
nnkProcDef.newTree(
newIdentNode("y"),
newEmptyNode(),
nnkGenericParams.newTree(
nnkIdentDefs.newTree(
newIdentNode("N"),
newEmptyNode(),
newEmptyNode()
)
),
nnkFormalParams.newTree(
nnkBracketExpr.newTree(
newIdentNode("array"),
newIdentNode("N"),
newIdentNode("int")
)
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkCall.newTree(
newIdentNode("default"),
nnkBracketExpr.newTree(
newIdentNode("array"),
newIdentNode("N"),
newIdentNode("int")
)
)
)
),
nnkDiscardStmt.newTree(
nnkCall.newTree(
nnkBracketExpr.newTree(
newIdentNode("y"),
newLit(1)
)
)
)
)
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
fatal.nim(39) sysFatal
Error: unhandled exception: int128.nim(72, 11) `arg.sdata(2) == 0` out of range [AssertionError]
IR
Compiled filesize0 bytes (0 bytes)
Stats
- Started
2024-01-12T13:34:06 - Finished
2024-01-12T13:34:06 - Duration
AST
nnkStmtList.newTree(
nnkProcDef.newTree(
newIdentNode("y"),
newEmptyNode(),
nnkGenericParams.newTree(
nnkIdentDefs.newTree(
newIdentNode("N"),
newEmptyNode(),
newEmptyNode()
)
),
nnkFormalParams.newTree(
nnkBracketExpr.newTree(
newIdentNode("array"),
newIdentNode("N"),
newIdentNode("int")
)
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkCall.newTree(
newIdentNode("default"),
nnkBracketExpr.newTree(
newIdentNode("array"),
newIdentNode("N"),
newIdentNode("int")
)
)
)
),
nnkDiscardStmt.newTree(
nnkCall.newTree(
nnkBracketExpr.newTree(
newIdentNode("y"),
newLit(1)
)
)
)
)
Stats
- GCC
11.4.0 - Clang
14.0.0 - NodeJS
19.0 - Created
2024-01-12T13:33:25Z - 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 16 minutes bisecting 7 commits at 0 commits per second
Workaround
proc y[N: static int](): array[N, int] = default(array[N, int])
discard y[1]()
Further simplified:
proc y[N]() =
var x: array[N, int]
y[1]()
Setting N to range[0..1] works
Probably caused by:
proc y[N]() =
echo N
y[1]()
int
Somehow semgnrc receives N as skType instead of skGenericParam and calls newSymNodeTypeDesc which converts it to typedesc[int] (?)
It looks like skGenericParam for tfWildcard is just never triggered, it is deleted immediately here
The question is do we want y[1]() to work without N: static, or are we fine with just making this not crash (which is why this code crashes):
var x: array[int, int]
Making y[1]() work is significantly harder because the compiler doesn't know how to handle an skGenericParam that can become a type in generic procs (same problem does not exist in generic type bodies like Foo[N] = object).
Sorry for yet another comment, but the issue causing the crash here (array[int, int]) is the same as #17163.
Related issues for N turning 1 to the type int are #12664 (generic types) and #13906 (generic procs).
Make it not crash please.