fixes #24472; let symbol created by template is reused in nimvm branch (#24473)

fixes #24472

Excluding variables which are initialized in the nimvm branch so that
they won't interfere the other branch

(cherry picked from commit e7f48cdd5c)
This commit is contained in:
ringabout
2024-11-26 19:35:48 +08:00
committed by narimiran
parent e6f5e49184
commit 7d425e712e
3 changed files with 22 additions and 0 deletions

View File

@@ -212,6 +212,7 @@ proc varDecl(a: PEffects; n: PNode) {.inline.} =
proc skipHiddenDeref(n: PNode): PNode {.inline.} =
result = if n.kind == nkHiddenDeref: n[0] else: n
proc initVar(a: PEffects, n: PNode; volatileCheck: bool) =
let n = skipHiddenDeref(n)
if n.kind != nkSym: return
@@ -1302,7 +1303,9 @@ proc track(tracked: PEffects, n: PNode) =
track(tracked, last)
of nkCaseStmt: trackCase(tracked, n)
of nkWhen: # This should be a "when nimvm" node.
let oldState = tracked.init.len
track(tracked, n[0][1])
tracked.init.setLen(oldState)
track(tracked, n[1][0])
of nkIfStmt, nkIfExpr: trackIf(tracked, n)
of nkBlockStmt, nkBlockExpr: trackBlock(tracked, n[1])

View File

@@ -19,6 +19,7 @@ proc volatileLoad*[T](src: ptr T): T {.inline, noinit.} =
when defined(js):
result = src[]
else:
result = default(T)
{.emit: [result, " = (*(", typeof(src[]), " volatile*)", src, ");"].}
proc volatileStore*[T](dest: ptr T, val: T) {.inline.} =

View File

@@ -83,3 +83,21 @@ proc foo2 =
doAssert z == 3
foo2()
# bug #24472
template bar1314(): bool =
let hello = true
hello
template foo1314*(val: bool): bool =
when nimvm:
val
else:
val
proc test() = # Doesn't fail when top level
# Original code is calling `unlikely` which has a `nimvm` branch
let s = foo1314(bar1314())
doAssert s
test()