mirror of
https://github.com/nim-lang/Nim.git
synced 2026-09-18 11:04:53 +00:00
Fixes #11797. Imported scalar and pointer aliases inherit their external C spelling, but receive a different Nim symbol. Signature hashing previously used that symbol identity, so aliases that emit exactly the same C type could produce different backend names for tuples, sequences, and other generic types. For example, `cint` and `type CIntAlias = cint` both emit `int`, but `seq[cint]` and `seq[CIntAlias]` could be emitted as incompatible C structs. The Nim type checker nevertheless permits assignments and calls between them, causing the generated C or C++ compilation to fail. This changes the backend hash to use the external type spelling when available. A symbol-based fallback remains for imported types without a resolved spelling. The change deliberately does not collapse imported types into their underlying Nim builtin. Types such as `pid_t`, imported pointers with qualifiers, and platform typedefs may require distinct backend representations. ## NIF and incremental compilation This does not change NIF serialization, NIF type keys, or the IC cache format. The bug is in backend type-name generation. An IC regression test is included to ensure that the corrected backend identity is preserved when compilation passes through the NIF pipeline. ## Tests The regressions cover: - tuple and sequence assignments between an imported type and its alias - cross-module sequence parameters and mutation - C and C++ backends - NIF-backed incremental compilation Existing C-type tests were also run under C/C++, refc, and ARC. ## Remaining scope This does not solve the broader question of compatibility between imported and builtin types that have different backend identities, such as `seq[cdouble]` and `seq[float]`. That remains tracked by #19374.
21 lines
286 B
Nim
21 lines
286 B
Nim
discard """
|
|
action: run
|
|
targets: "c cpp"
|
|
"""
|
|
|
|
type CIntAlias = cint
|
|
|
|
var x: (cint,) = (1.cint,)
|
|
var y: (CIntAlias,) = x
|
|
x = y
|
|
doAssert x[0] == 1.cint
|
|
|
|
var a: seq[cint]
|
|
var b: seq[CIntAlias]
|
|
a.add 1.cint
|
|
a.add 2.cint
|
|
b = a
|
|
a = b
|
|
doAssert a[0] == 1.cint
|
|
doAssert b[1] == CIntAlias(2)
|