From c5d62bcbfe43ce0b1470fcf503654ab8a8b0cfd7 Mon Sep 17 00:00:00 2001 From: Bung Date: Fri, 21 Oct 2022 15:28:18 +0800 Subject: [PATCH] fix #19349 incompatible type when mixing float32 and cfloat in generics (#20551) (cherry picked from commit 84fab7f39bd89ef6e9c3e104a17af8d9f049d8e6) --- compiler/types.nim | 3 ++- tests/alias/t19349.nim | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 tests/alias/t19349.nim diff --git a/compiler/types.nim b/compiler/types.nim index 02e40bb432..19acd62770 100644 --- a/compiler/types.nim +++ b/compiler/types.nim @@ -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: diff --git a/tests/alias/t19349.nim b/tests/alias/t19349.nim new file mode 100644 index 0000000000..1e1e582642 --- /dev/null +++ b/tests/alias/t19349.nim @@ -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]]))