From 1201c184d761aea7fb24f8cf31d7c11bb2f114c2 Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Tue, 18 Aug 2026 05:37:46 +0800 Subject: [PATCH] fix #26112: update variable kinds in isPartOf to include skResult (#26114) fix #26112 --- compiler/aliases.nim | 2 +- tests/ccgbugs/t26112.nim | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 tests/ccgbugs/t26112.nim diff --git a/compiler/aliases.nim b/compiler/aliases.nim index 639367b9b6..8775355c92 100644 --- a/compiler/aliases.nim +++ b/compiler/aliases.nim @@ -168,7 +168,7 @@ proc isPartOf*(a, b: PNode; flags: set[PartFlag] = {}): TAnalysisResult = if a.kind == b.kind: case a.kind of nkSym: - const varKinds = {skVar, skTemp, skProc, skFunc} + const varKinds = {skVar, skTemp, skResult, skProc, skFunc} # same symbol: aliasing: if a.sym.id == b.sym.id: result = arYes elif a.sym.kind in varKinds or b.sym.kind in varKinds: diff --git a/tests/ccgbugs/t26112.nim b/tests/ccgbugs/t26112.nim new file mode 100644 index 0000000000..f10250b61f --- /dev/null +++ b/tests/ccgbugs/t26112.nim @@ -0,0 +1,35 @@ +discard """ + matrix: "--mm:refc; --mm:orc" + ccodeCheck: "'result.fromScalar = x_p0;'" + ccodeCheck: "'result.fromObject = x_p0.fromObject;'" + ccodeCheck: "'result.nested.fromNested = x_p0.fromNested;'" +""" + +# bug #26112: unrelated parameters were considered potential aliases of the +# result location when their types could be contained in the returned object. + +type + Inner = object + fromNested: int + P = object + fromScalar: int + fromObject: int + nested: Inner + +func fromScalar(x: int): P = + P(fromScalar: x) + +proc fromObject(x: P): P = + P(fromObject: x.fromObject) + +func fromNested(x: Inner): P = + P(nested: Inner(fromNested: x.fromNested)) + +proc selfAlias(): P = + result.fromScalar = 42 + result = P(fromScalar: result.fromScalar) + +doAssert fromScalar(1).fromScalar == 1 +doAssert fromObject(P(fromObject: 2)).fromObject == 2 +doAssert fromNested(Inner(fromNested: 3)).nested.fromNested == 3 +doAssert selfAlias().fromScalar == 42