-
-
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
Compiler crash when writing to ptr UncheckedArray
casted from pointer
in JS backend
#24120
Comments
!nim js proc uchrr(outp, inp: pointer) =
var i = cast[ptr UncheckedArray[byte]](inp)
var o = cast[ptr UncheckedArray[byte]](outp)
o[0] = i[0]
let n = 0xdeadbeef
var no: int32
uchrr(no.addr(), n.addr())
assert no == 0xef |
🐧 Linux bisect by @juancarlospaco (collaborator)devel 👎 FAILOutput
IRCompiled filesize0 (0 bytes)
Stats
ASTnnkStmtList.newTree(
nnkProcDef.newTree(
newIdentNode("uchrr"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode(),
nnkIdentDefs.newTree(
newIdentNode("outp"),
newIdentNode("inp"),
newIdentNode("pointer"),
newEmptyNode()
)
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkVarSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("i"),
newEmptyNode(),
nnkCast.newTree(
nnkPtrTy.newTree(
nnkBracketExpr.newTree(
newIdentNode("UncheckedArray"),
newIdentNode("byte")
)
),
newIdentNode("inp")
)
)
),
nnkVarSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("o"),
newEmptyNode(),
nnkCast.newTree(
nnkPtrTy.newTree(
nnkBracketExpr.newTree(
newIdentNode("UncheckedArray"),
newIdentNode("byte")
)
),
newIdentNode("outp")
)
)
),
nnkAsgn.newTree(
nnkBracketExpr.newTree(
newIdentNode("o"),
newLit(0)
),
nnkBracketExpr.newTree(
newIdentNode("i"),
newLit(0)
)
)
)
),
nnkLetSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("n"),
newEmptyNode(),
newLit(3735928559)
)
),
nnkVarSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("no"),
newIdentNode("int32"),
newEmptyNode()
)
),
nnkCall.newTree(
newIdentNode("uchrr"),
nnkCall.newTree(
nnkDotExpr.newTree(
newIdentNode("no"),
newIdentNode("addr")
)
),
nnkCall.newTree(
nnkDotExpr.newTree(
newIdentNode("n"),
newIdentNode("addr")
)
)
),
nnkCommand.newTree(
newIdentNode("assert"),
nnkInfix.newTree(
newIdentNode("=="),
newIdentNode("no"),
newLit(239)
)
)
) stable 👎 FAILOutput
IRCompiled filesize0 (0 bytes)
Stats
ASTnnkStmtList.newTree(
nnkProcDef.newTree(
newIdentNode("uchrr"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode(),
nnkIdentDefs.newTree(
newIdentNode("outp"),
newIdentNode("inp"),
newIdentNode("pointer"),
newEmptyNode()
)
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkVarSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("i"),
newEmptyNode(),
nnkCast.newTree(
nnkPtrTy.newTree(
nnkBracketExpr.newTree(
newIdentNode("UncheckedArray"),
newIdentNode("byte")
)
),
newIdentNode("inp")
)
)
),
nnkVarSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("o"),
newEmptyNode(),
nnkCast.newTree(
nnkPtrTy.newTree(
nnkBracketExpr.newTree(
newIdentNode("UncheckedArray"),
newIdentNode("byte")
)
),
newIdentNode("outp")
)
)
),
nnkAsgn.newTree(
nnkBracketExpr.newTree(
newIdentNode("o"),
newLit(0)
),
nnkBracketExpr.newTree(
newIdentNode("i"),
newLit(0)
)
)
)
),
nnkLetSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("n"),
newEmptyNode(),
newLit(3735928559)
)
),
nnkVarSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("no"),
newIdentNode("int32"),
newEmptyNode()
)
),
nnkCall.newTree(
newIdentNode("uchrr"),
nnkCall.newTree(
nnkDotExpr.newTree(
newIdentNode("no"),
newIdentNode("addr")
)
),
nnkCall.newTree(
nnkDotExpr.newTree(
newIdentNode("n"),
newIdentNode("addr")
)
)
),
nnkCommand.newTree(
newIdentNode("assert"),
nnkInfix.newTree(
newIdentNode("=="),
newIdentNode("no"),
newLit(239)
)
)
) 2.0.8 👎 FAILOutput
IRCompiled filesize0 (0 bytes)
Stats
ASTnnkStmtList.newTree(
nnkProcDef.newTree(
newIdentNode("uchrr"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode(),
nnkIdentDefs.newTree(
newIdentNode("outp"),
newIdentNode("inp"),
newIdentNode("pointer"),
newEmptyNode()
)
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkVarSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("i"),
newEmptyNode(),
nnkCast.newTree(
nnkPtrTy.newTree(
nnkBracketExpr.newTree(
newIdentNode("UncheckedArray"),
newIdentNode("byte")
)
),
newIdentNode("inp")
)
)
),
nnkVarSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("o"),
newEmptyNode(),
nnkCast.newTree(
nnkPtrTy.newTree(
nnkBracketExpr.newTree(
newIdentNode("UncheckedArray"),
newIdentNode("byte")
)
),
newIdentNode("outp")
)
)
),
nnkAsgn.newTree(
nnkBracketExpr.newTree(
newIdentNode("o"),
newLit(0)
),
nnkBracketExpr.newTree(
newIdentNode("i"),
newLit(0)
)
)
)
),
nnkLetSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("n"),
newEmptyNode(),
newLit(3735928559)
)
),
nnkVarSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("no"),
newIdentNode("int32"),
newEmptyNode()
)
),
nnkCall.newTree(
newIdentNode("uchrr"),
nnkCall.newTree(
nnkDotExpr.newTree(
newIdentNode("no"),
newIdentNode("addr")
)
),
nnkCall.newTree(
nnkDotExpr.newTree(
newIdentNode("n"),
newIdentNode("addr")
)
)
),
nnkCommand.newTree(
newIdentNode("assert"),
nnkInfix.newTree(
newIdentNode("=="),
newIdentNode("no"),
newLit(239)
)
)
) 2.0.0 👎 FAILOutput
IRCompiled filesize0 (0 bytes)
Stats
ASTnnkStmtList.newTree(
nnkProcDef.newTree(
newIdentNode("uchrr"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode(),
nnkIdentDefs.newTree(
newIdentNode("outp"),
newIdentNode("inp"),
newIdentNode("pointer"),
newEmptyNode()
)
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkVarSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("i"),
newEmptyNode(),
nnkCast.newTree(
nnkPtrTy.newTree(
nnkBracketExpr.newTree(
newIdentNode("UncheckedArray"),
newIdentNode("byte")
)
),
newIdentNode("inp")
)
)
),
nnkVarSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("o"),
newEmptyNode(),
nnkCast.newTree(
nnkPtrTy.newTree(
nnkBracketExpr.newTree(
newIdentNode("UncheckedArray"),
newIdentNode("byte")
)
),
newIdentNode("outp")
)
)
),
nnkAsgn.newTree(
nnkBracketExpr.newTree(
newIdentNode("o"),
newLit(0)
),
nnkBracketExpr.newTree(
newIdentNode("i"),
newLit(0)
)
)
)
),
nnkLetSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("n"),
newEmptyNode(),
newLit(3735928559)
)
),
nnkVarSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("no"),
newIdentNode("int32"),
newEmptyNode()
)
),
nnkCall.newTree(
newIdentNode("uchrr"),
nnkCall.newTree(
nnkDotExpr.newTree(
newIdentNode("no"),
newIdentNode("addr")
)
),
nnkCall.newTree(
nnkDotExpr.newTree(
newIdentNode("n"),
newIdentNode("addr")
)
)
),
nnkCommand.newTree(
newIdentNode("assert"),
nnkInfix.newTree(
newIdentNode("=="),
newIdentNode("no"),
newLit(239)
)
)
) 1.6.20 👎 FAILOutput
IRCompiled filesize0 (0 bytes)
Stats
ASTnnkStmtList.newTree(
nnkProcDef.newTree(
newIdentNode("uchrr"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode(),
nnkIdentDefs.newTree(
newIdentNode("outp"),
newIdentNode("inp"),
newIdentNode("pointer"),
newEmptyNode()
)
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkVarSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("i"),
newEmptyNode(),
nnkCast.newTree(
nnkPtrTy.newTree(
nnkBracketExpr.newTree(
newIdentNode("UncheckedArray"),
newIdentNode("byte")
)
),
newIdentNode("inp")
)
)
),
nnkVarSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("o"),
newEmptyNode(),
nnkCast.newTree(
nnkPtrTy.newTree(
nnkBracketExpr.newTree(
newIdentNode("UncheckedArray"),
newIdentNode("byte")
)
),
newIdentNode("outp")
)
)
),
nnkAsgn.newTree(
nnkBracketExpr.newTree(
newIdentNode("o"),
newLit(0)
),
nnkBracketExpr.newTree(
newIdentNode("i"),
newLit(0)
)
)
)
),
nnkLetSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("n"),
newEmptyNode(),
newLit(3735928559)
)
),
nnkVarSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("no"),
newIdentNode("int32"),
newEmptyNode()
)
),
nnkCall.newTree(
newIdentNode("uchrr"),
nnkCall.newTree(
nnkDotExpr.newTree(
newIdentNode("no"),
newIdentNode("addr")
)
),
nnkCall.newTree(
nnkDotExpr.newTree(
newIdentNode("n"),
newIdentNode("addr")
)
)
),
nnkCommand.newTree(
newIdentNode("assert"),
nnkInfix.newTree(
newIdentNode("=="),
newIdentNode("no"),
newLit(239)
)
)
) 1.4.8 👎 FAILOutput
IRCompiled filesize0 (0 bytes)
Stats
ASTnnkStmtList.newTree(
nnkProcDef.newTree(
newIdentNode("uchrr"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode(),
nnkIdentDefs.newTree(
newIdentNode("outp"),
newIdentNode("inp"),
newIdentNode("pointer"),
newEmptyNode()
)
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkVarSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("i"),
newEmptyNode(),
nnkCast.newTree(
nnkPtrTy.newTree(
nnkBracketExpr.newTree(
newIdentNode("UncheckedArray"),
newIdentNode("byte")
)
),
newIdentNode("inp")
)
)
),
nnkVarSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("o"),
newEmptyNode(),
nnkCast.newTree(
nnkPtrTy.newTree(
nnkBracketExpr.newTree(
newIdentNode("UncheckedArray"),
newIdentNode("byte")
)
),
newIdentNode("outp")
)
)
),
nnkAsgn.newTree(
nnkBracketExpr.newTree(
newIdentNode("o"),
newLit(0)
),
nnkBracketExpr.newTree(
newIdentNode("i"),
newLit(0)
)
)
)
),
nnkLetSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("n"),
newEmptyNode(),
newLit(3735928559)
)
),
nnkVarSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("no"),
newIdentNode("int32"),
newEmptyNode()
)
),
nnkCall.newTree(
newIdentNode("uchrr"),
nnkCall.newTree(
nnkDotExpr.newTree(
newIdentNode("no"),
newIdentNode("addr")
)
),
nnkCall.newTree(
nnkDotExpr.newTree(
newIdentNode("n"),
newIdentNode("addr")
)
)
),
nnkCommand.newTree(
newIdentNode("assert"),
nnkInfix.newTree(
newIdentNode("=="),
newIdentNode("no"),
newLit(239)
)
)
) 1.2.18 👎 FAILOutput
IRCompiled filesize0 (0 bytes)
Stats
ASTnnkStmtList.newTree(
nnkProcDef.newTree(
newIdentNode("uchrr"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode(),
nnkIdentDefs.newTree(
newIdentNode("outp"),
newIdentNode("inp"),
newIdentNode("pointer"),
newEmptyNode()
)
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkVarSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("i"),
newEmptyNode(),
nnkCast.newTree(
nnkPtrTy.newTree(
nnkBracketExpr.newTree(
newIdentNode("UncheckedArray"),
newIdentNode("byte")
)
),
newIdentNode("inp")
)
)
),
nnkVarSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("o"),
newEmptyNode(),
nnkCast.newTree(
nnkPtrTy.newTree(
nnkBracketExpr.newTree(
newIdentNode("UncheckedArray"),
newIdentNode("byte")
)
),
newIdentNode("outp")
)
)
),
nnkAsgn.newTree(
nnkBracketExpr.newTree(
newIdentNode("o"),
newLit(0)
),
nnkBracketExpr.newTree(
newIdentNode("i"),
newLit(0)
)
)
)
),
nnkLetSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("n"),
newEmptyNode(),
newLit(3735928559)
)
),
nnkVarSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("no"),
newIdentNode("int32"),
newEmptyNode()
)
),
nnkCall.newTree(
newIdentNode("uchrr"),
nnkCall.newTree(
nnkDotExpr.newTree(
newIdentNode("no"),
newIdentNode("addr")
)
),
nnkCall.newTree(
nnkDotExpr.newTree(
newIdentNode("n"),
newIdentNode("addr")
)
)
),
nnkCommand.newTree(
newIdentNode("assert"),
nnkInfix.newTree(
newIdentNode("=="),
newIdentNode("no"),
newLit(239)
)
)
) 1.0.10 👎 FAILOutput
IRCompiled filesize0 (0 bytes)
Stats
ASTnnkStmtList.newTree(
nnkProcDef.newTree(
newIdentNode("uchrr"),
newEmptyNode(),
newEmptyNode(),
nnkFormalParams.newTree(
newEmptyNode(),
nnkIdentDefs.newTree(
newIdentNode("outp"),
newIdentNode("inp"),
newIdentNode("pointer"),
newEmptyNode()
)
),
newEmptyNode(),
newEmptyNode(),
nnkStmtList.newTree(
nnkVarSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("i"),
newEmptyNode(),
nnkCast.newTree(
nnkPtrTy.newTree(
nnkBracketExpr.newTree(
newIdentNode("UncheckedArray"),
newIdentNode("byte")
)
),
newIdentNode("inp")
)
)
),
nnkVarSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("o"),
newEmptyNode(),
nnkCast.newTree(
nnkPtrTy.newTree(
nnkBracketExpr.newTree(
newIdentNode("UncheckedArray"),
newIdentNode("byte")
)
),
newIdentNode("outp")
)
)
),
nnkAsgn.newTree(
nnkBracketExpr.newTree(
newIdentNode("o"),
newLit(0)
),
nnkBracketExpr.newTree(
newIdentNode("i"),
newLit(0)
)
)
)
),
nnkLetSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("n"),
newEmptyNode(),
newLit(3735928559)
)
),
nnkVarSection.newTree(
nnkIdentDefs.newTree(
newIdentNode("no"),
newIdentNode("int32"),
newEmptyNode()
)
),
nnkCall.newTree(
newIdentNode("uchrr"),
nnkCall.newTree(
nnkDotExpr.newTree(
newIdentNode("no"),
newIdentNode("addr")
)
),
nnkCall.newTree(
nnkDotExpr.newTree(
newIdentNode("n"),
newIdentNode("addr")
)
)
),
nnkCommand.newTree(
newIdentNode("assert"),
nnkInfix.newTree(
newIdentNode("=="),
newIdentNode("no"),
newLit(239)
)
)
) Stats
🤖 Bug found in |
If we make this not crash, this is going to cause problems at runtime because Still fixing the crash is required if we want to use |
Is there any use for |
Description
The following code crashes the compiler when generating code for the Javascript backend. It does not crash when using the C backend, however.
Nim Version
Nim Compiler Version 2.1.99 [Linux: amd64]
Compiled at 2024-09-16
Copyright (c) 2006-2024 by Andreas Rumpf
git hash: 651fdbe
Current Output
Expected Output
Known Workarounds
No response
Additional Information
Same behavior in stable 2.0.8 release.
The text was updated successfully, but these errors were encountered: