mirror of
https://github.com/nim-lang/Nim.git
synced 2026-05-28 15:55:14 +00:00
fixes #25469
This pull request introduces an important fix to argument handling in
the compiler's transformation logic and adds a new test to verify
correct behavior with distinct types and ARC memory management.
### Compiler transformation improvements
* Updated `putArgInto` in `compiler/transf.nim` to handle
`nkHiddenStdConv`, `nkHiddenSubConv`, and `nkConv` nodes more
accurately. Now, if the types match (ignoring distinctness and shallow
range differences), the argument is recursively processed; otherwise, it
falls back to a fast assignment. This prevents incorrect assignments
when dealing with type conversions and distinct types.
### Testing for distinct types and ARC
* Added a new test `tdistinct_for_nodup.nim` to ensure correct iteration
and memory management for distinct sequences of large arrays under ARC.
The test checks that the sequence length remains unchanged during
iteration, helping catch regressions related to ARC and distinct types.
(cherry picked from commit 2b2872928b)
This commit is contained in:
@@ -703,6 +703,11 @@ proc putArgInto(arg: PNode, formal: PType): TPutArgInto =
|
||||
of nkAddr, nkHiddenAddr:
|
||||
result = putArgInto(arg[0], formal)
|
||||
if result == paViaIndirection: result = paFastAsgn
|
||||
of nkHiddenStdConv, nkHiddenSubConv, nkConv:
|
||||
if compareTypes(arg.typ, arg[1].typ, dcEqIgnoreDistinct, {IgnoreRangeShallow}):
|
||||
result = putArgInto(arg[1], formal)
|
||||
else:
|
||||
result = paFastAsgn
|
||||
of nkCurly, nkBracket:
|
||||
for i in 0..<arg.len:
|
||||
if putArgInto(arg[i], formal) != paDirectMapping:
|
||||
|
||||
33
tests/arc/tdistinct_for_nodup.nim
Normal file
33
tests/arc/tdistinct_for_nodup.nim
Normal file
@@ -0,0 +1,33 @@
|
||||
discard """
|
||||
cmd: '''nim c --mm:arc --expandArc:foo $file'''
|
||||
nimout: '''
|
||||
--expandArc: foo
|
||||
|
||||
var broken_cursor
|
||||
block :tmp:
|
||||
var i
|
||||
var i_1 = 0
|
||||
let L = len(seq[Large](broken_cursor))
|
||||
block :tmp_1:
|
||||
while i_1 < L:
|
||||
i = seq[Large](broken_cursor)[i_1]
|
||||
discard i
|
||||
{.push, overflowChecks: false.}
|
||||
inc(i_1, 1)
|
||||
{.pop.}
|
||||
-- end of expandArc ------------------------
|
||||
'''
|
||||
"""
|
||||
|
||||
|
||||
type
|
||||
Large = array[1024, byte]
|
||||
List = distinct seq[Large]
|
||||
|
||||
proc foo =
|
||||
var
|
||||
broken: List
|
||||
for i in seq[Large](broken):
|
||||
discard i
|
||||
|
||||
foo()
|
||||
Reference in New Issue
Block a user