mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
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:
@@ -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:
|
||||
|
||||
@@ -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.} =
|
||||
|
||||
Reference in New Issue
Block a user