From a4a482b5ef6d1a48f28b42e778770c1001f8293a Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Fri, 20 Mar 2026 14:07:26 +0800 Subject: [PATCH] fixes #25620; typekey skips incorrectly the base type of `seqs` etc. types for `nim ic` (#25621) fixes #25620 This pull request includes a fix to the type key generation logic in the compiler and updates to a test file to cover additional language features. The most important changes are summarized below: ### Compiler logic fix * In `compiler/typekeys.nim`, the `typeKey` procedure was updated to iterate over all elements in `t.sonsImpl` starting from index 0 instead of 1, ensuring that all type sons are considered during type key generation. ### Test suite improvements * The test file `tests/ic/tenum.nim` was renamed to `tests/ic/tmiscs.nim`, and its output expectations were updated to reflect the new test cases. * Added new test cases to `tests/ic/tmiscs.nim` to cover sink and move semantics, including the definition of a `BigObj` type and a `consume` procedure that demonstrates moving and consuming large objects. ```nim # Sink and move semantics type BigObj = object data: seq[int] proc consume(x: sink BigObj) = echo x.data.len var b = BigObj(data: @[1, 2, 3, 4, 5]) consume(move b) ``` gives ``` error: passing 'tySequence__qwqHTkRvwhrRyENtudHQ7g' (aka 'struct tySequence__qwqHTkRvwhrRyENtudHQ7g') to parameter of incompatible type 'tySequence__cTyVHeHOWk5jStsToosJ8Q' (aka 'struct tySequence__cTyVHeHOWk5jStsToosJ8Q') 84 | eqdestroy___sysma2dyk_u75((*dest_p0).data); ``` follows up https://github.com/nim-lang/Nim/pull/25614 --- compiler/typekeys.nim | 2 +- tests/ic/{tenum.nim => tmiscs.nim} | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) rename tests/ic/{tenum.nim => tmiscs.nim} (63%) diff --git a/compiler/typekeys.nim b/compiler/typekeys.nim index 06e633b317..d1c77ec3fe 100644 --- a/compiler/typekeys.nim +++ b/compiler/typekeys.nim @@ -274,7 +274,7 @@ proc typeKey(c: var Context; t: PType; flags: set[ConsiderFlag]; conf: ConfigRef c.typeKey(t.sonsImpl[0], flags-{CoIgnoreRange}, conf) else: withTree c.m, toNifTag(t.kind): - for i in 1..