don't track result initialization if it is marked noinit (#24499)

We don't track `noinit` for variables introduced in
https://github.com/nim-lang/Nim/pull/10566. It should be applied to
`result` if the function is marked `noinit`
This commit is contained in:
ringabout
2024-12-04 22:12:30 +08:00
committed by GitHub
parent bbf6a62c90
commit 2e9e7f13ee
2 changed files with 5 additions and 2 deletions

View File

@@ -1644,6 +1644,9 @@ proc trackProc*(c: PContext; s: PSym, body: PNode) =
s.kind in {skProc, skFunc, skConverter, skMethod}:
var res = s.ast[resultPos].sym # get result symbol
t.scopes[res.id] = t.currentBlock
if sfNoInit in s.flags:
# marks result "noinit"
incl res.flags, sfNoInit
track(t, body)
@@ -1662,7 +1665,8 @@ proc trackProc*(c: PContext; s: PSym, body: PNode) =
if not isEmptyType(s.typ.returnType) and
(s.typ.returnType.requiresInit or s.typ.returnType.skipTypes(abstractInst).kind == tyVar or
noStrictDefs notin c.config.legacyFeatures) and
s.kind in {skProc, skFunc, skConverter, skMethod} and s.magic == mNone:
s.kind in {skProc, skFunc, skConverter, skMethod} and s.magic == mNone and
sfNoInit notin s.flags:
var res = s.ast[resultPos].sym # get result symbol
if res.id notin t.init and breaksBlock(body) != bsNoReturn:
if tfRequiresInit in s.typ.returnType.flags:

View File

@@ -19,7 +19,6 @@ 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.} =