fix #19349 incompatible type when mixing float32 and cfloat in generics (#20551)

(cherry picked from commit 84fab7f39b)
This commit is contained in:
Bung
2022-10-21 15:28:18 +08:00
committed by narimiran
parent 8e04112762
commit c5d62bcbfe
2 changed files with 21 additions and 1 deletions

View File

@@ -1145,13 +1145,14 @@ proc sameTypeAux(x, y: PType, c: var TSameTypeClosure): bool =
of tyEmpty, tyChar, tyBool, tyNil, tyPointer, tyString, tyCstring,
tyInt..tyUInt64, tyTyped, tyUntyped, tyVoid:
result = sameFlags(a, b)
if result and PickyCAliases in c.flags:
if result and {PickyCAliases, ExactTypeDescValues} <= c.flags:
# additional requirement for the caching of generics for importc'ed types:
# the symbols must be identical too:
let symFlagsA = if a.sym != nil: a.sym.flags else: {}
let symFlagsB = if b.sym != nil: b.sym.flags else: {}
if (symFlagsA+symFlagsB) * {sfImportc, sfExportc} != {}:
result = symFlagsA == symFlagsB
of tyStatic, tyFromExpr:
result = exprStructuralEquivalent(a.n, b.n) and sameFlags(a, b)
if result and a.len == b.len and a.len == 1:

19
tests/alias/t19349.nim Normal file
View File

@@ -0,0 +1,19 @@
discard """
action: "compile"
"""
type
Vec3[T: SomeNumber] = object
arr: array[3, T]
var
cfloatArr: array[3, array[3, cfloat]]
cfloatSeq = newSeq[Vec3[cfloat]]()
for row in cfloatArr:
cfloatSeq.add(Vec3[float32](arr: [row[0], row[1], row[2]]))
var
cuintArr: array[3, array[3, cuint]]
cuintSeq = newSeq[Vec3[cuint]]()
for row in cuintArr:
cuintSeq.add(Vec3[uint32](arr: [row[0], row[1], row[2]]))