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

Compiler crash when writing to ptr UncheckedArray casted from pointer in JS backend #24120

Open
tocariimaa opened this issue Sep 16, 2024 · 4 comments

Comments

@tocariimaa
Copy link
Contributor

Description

The following code crashes the compiler when generating code for the Javascript backend. It does not crash when using the C backend, however.

proc uchrr(outp, inp: pointer) =
  var i = cast[ptr UncheckedArray[byte]](inp)
  var o = cast[ptr UncheckedArray[byte]](outp)
  o[0] = i[0]  # <-- compiler crashes here

let n = 0xdeadbeef
var no: int32
uchrr(no.addr(), n.addr())
assert no == 0xef

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

/home/user/Nim/buge.nim(4, 4) Error: internal error: expr(nkBracketExpr, tyUncheckedArray)
Traceback (most recent call last)
/home/user/Nim/compiler/nim.nim(169) nim
/home/user/Nim/compiler/nim.nim(124) handleCmdLine
/home/user/Nim/compiler/main.nim(307) mainCommand
/home/user/Nim/compiler/main.nim(277) compileToBackend
/home/user/Nim/compiler/main.nim(171) commandCompileToJS
/home/user/Nim/compiler/pipelines.nim(312) compilePipelineProject
/home/user/Nim/compiler/pipelines.nim(232) compilePipelineModule
/home/user/Nim/compiler/pipelines.nim(179) processPipelineModule
/home/user/Nim/compiler/pipelines.nim(28) processPipeline
/home/user/Nim/compiler/jsgen.nim(3155) processJSCodeGen
/home/user/Nim/compiler/jsgen.nim(3140) genModule
/home/user/Nim/compiler/jsgen.nim(2829) genStmt
/home/user/Nim/compiler/jsgen.nim(3027) gen
/home/user/Nim/compiler/jsgen.nim(2829) genStmt
/home/user/Nim/compiler/jsgen.nim(2974) gen
/home/user/Nim/compiler/jsgen.nim(1871) genCall
/home/user/Nim/compiler/jsgen.nim(2900) gen
/home/user/Nim/compiler/jsgen.nim(1697) genSym
/home/user/Nim/compiler/jsgen.nim(1631) genProcForSymIfNeeded
/home/user/Nim/compiler/jsgen.nim attachProc
/home/user/Nim/compiler/jsgen.nim(2780) genProc
/home/user/Nim/compiler/jsgen.nim(2829) genStmt
/home/user/Nim/compiler/jsgen.nim(3027) gen
/home/user/Nim/compiler/jsgen.nim(2829) genStmt
/home/user/Nim/compiler/jsgen.nim(3043) gen
/home/user/Nim/compiler/jsgen.nim(1342) genAsgn
/home/user/Nim/compiler/jsgen.nim(1284) genAsgnAux
/home/user/Nim/compiler/jsgen.nim(3002) gen
/home/user/Nim/compiler/jsgen.nim(1491) genArrayAccess
/home/user/Nim/compiler/msgs.nim(634) internalErrorImpl
/home/user/Nim/compiler/msgs.nim(589) liMessage
/home/user/Nim/compiler/msgs.nim(433) handleError
/home/user/Nim/compiler/msgs.nim(421) quit

Expected Output

Successful compilation and program termination.

Known Workarounds

No response

Additional Information

Same behavior in stable 2.0.8 release.

@juancarlospaco
Copy link
Collaborator

!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

Copy link
Contributor

🐧 Linux bisect by @juancarlospaco (collaborator)
devel 👎 FAIL

Output


IR

Compiled filesize 0 (0 bytes)

Stats

  • Started 2024-09-16T21:56:59
  • Finished 2024-09-16T21:56:59
  • Duration

AST

nnkStmtList.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 👎 FAIL

Output


IR

Compiled filesize 0 (0 bytes)

Stats

  • Started 2024-09-16T21:57:03
  • Finished 2024-09-16T21:57:03
  • Duration

AST

nnkStmtList.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 👎 FAIL

Output


IR

Compiled filesize 0 (0 bytes)

Stats

  • Started 2024-09-16T21:57:03
  • Finished 2024-09-16T21:57:03
  • Duration

AST

nnkStmtList.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 👎 FAIL

Output


IR

Compiled filesize 0 (0 bytes)

Stats

  • Started 2024-09-16T21:57:07
  • Finished 2024-09-16T21:57:07
  • Duration

AST

nnkStmtList.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 👎 FAIL

Output


IR

Compiled filesize 0 (0 bytes)

Stats

  • Started 2024-09-16T21:57:10
  • Finished 2024-09-16T21:57:10
  • Duration

AST

nnkStmtList.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 👎 FAIL

Output


IR

Compiled filesize 0 (0 bytes)

Stats

  • Started 2024-09-16T21:57:13
  • Finished 2024-09-16T21:57:13
  • Duration

AST

nnkStmtList.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 👎 FAIL

Output


IR

Compiled filesize 0 (0 bytes)

Stats

  • Started 2024-09-16T21:57:15
  • Finished 2024-09-16T21:57:15
  • Duration

AST

nnkStmtList.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 👎 FAIL

Output


IR

Compiled filesize 0 (0 bytes)

Stats

  • Started 2024-09-16T21:57:17
  • Finished 2024-09-16T21:57:18
  • Duration

AST

nnkStmtList.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
  • GCC 11.4.0
  • Clang 14.0.0
  • NodeJS 20.4
  • Created 2024-09-16T21:35:28Z
  • Comments 2
  • Commands nim js -d:nodejs -d:nimExperimentalAsyncjsThen -d:nimExperimentalJsfetch --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 22 mins bisecting 8 commits at 0 commits per second

@metagn
Copy link
Collaborator

metagn commented Sep 16, 2024

If we make this not crash, this is going to cause problems at runtime because no.addr is going to be [[0], 0]. I don't know what a solution to this could be, maybe banning UncheckedArray, maybe warning on implicit conversions to pointer (this won't solve many cases). In general ptr has no other use in JS than taking addrs of locals, fields and array elements. I don't know what the compiler can say that makes this known when necessary.

Still fixing the crash is required if we want to use UncheckedArray at all in JS, for this case we can add tyUncheckedArray here.

@tocariimaa
Copy link
Contributor Author

If we make this not crash, this is going to cause problems at runtime because no.addr is going to be [[0], 0]. I don't know what a solution to this could be, maybe banning UncheckedArray, maybe warning on implicit conversions to pointer (this won't solve many cases). In general ptr has no other use in JS than taking addrs of locals, fields and array elements. I don't know what the compiler can say that makes this known when necessary.

Still fixing the crash is required if we want to use UncheckedArray at all in JS, for this case we can add tyUncheckedArray here.

Is there any use for UncheckedArray in Nim code targeting the JS backend?

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