mirror of
https://github.com/nim-lang/Nim.git
synced 2026-08-18 21:01:38 +00:00
fix #26112
This commit is contained in:
@@ -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:
|
||||
|
||||
35
tests/ccgbugs/t26112.nim
Normal file
35
tests/ccgbugs/t26112.nim
Normal file
@@ -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
|
||||
Reference in New Issue
Block a user