From 2e9e7f13ee7dda0ecf4010c6edc77d9e495c1633 Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Wed, 4 Dec 2024 22:12:30 +0800 Subject: [PATCH] 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` --- compiler/sempass2.nim | 6 +++++- lib/pure/volatile.nim | 1 - 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/compiler/sempass2.nim b/compiler/sempass2.nim index f1e31b7f7e42..6b757b5f8552 100644 --- a/compiler/sempass2.nim +++ b/compiler/sempass2.nim @@ -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: diff --git a/lib/pure/volatile.nim b/lib/pure/volatile.nim index 0b79b6101554..a38247c7db1d 100644 --- a/lib/pure/volatile.nim +++ b/lib/pure/volatile.nim @@ -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.} =