summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/seminst.nim3
-rw-r--r--compiler/semtypinst.nim2
-rw-r--r--compiler/types.nim8
-rw-r--r--tests/arc/tarcmisc.nim11
4 files changed, 22 insertions, 2 deletions
diff --git a/compiler/seminst.nim b/compiler/seminst.nim
index e1fad236c..456e40a94 100644
--- a/compiler/seminst.nim
+++ b/compiler/seminst.nim
@@ -91,7 +91,8 @@ proc sameInstantiation(a, b: TInstantiation): bool =
     for i in 0..a.concreteTypes.high:
       if not compareTypes(a.concreteTypes[i], b.concreteTypes[i],
                           flags = {ExactTypeDescValues,
-                                   ExactGcSafety}): return
+                                   ExactGcSafety,
+                                   PickyCAliases}): return
     result = true
 
 proc genericCacheGet(g: ModuleGraph; genericSym: PSym, entry: TInstantiation;
diff --git a/compiler/semtypinst.nim b/compiler/semtypinst.nim
index 18febb52e..9f9eb9489 100644
--- a/compiler/semtypinst.nim
+++ b/compiler/semtypinst.nim
@@ -51,7 +51,7 @@ proc searchInstTypes*(g: ModuleGraph; key: PType): PType =
       for j in 1..high(key.sons):
         # XXX sameType is not really correct for nested generics?
         if not compareTypes(inst[j], key[j],
-                            flags = {ExactGenericParams}):
+                            flags = {ExactGenericParams, PickyCAliases}):
           break matchType
 
       return inst
diff --git a/compiler/types.nim b/compiler/types.nim
index 61f563514..cf6579317 100644
--- a/compiler/types.nim
+++ b/compiler/types.nim
@@ -896,6 +896,7 @@ type
     ExactConstraints
     ExactGcSafety
     AllowCommonBase
+    PickyCAliases  # be picky about the distinction between 'cint' and 'int32'
 
   TTypeCmpFlags* = set[TTypeCmpFlag]
 
@@ -1144,6 +1145,13 @@ 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:
+      # 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/arc/tarcmisc.nim b/tests/arc/tarcmisc.nim
index 7daea62c8..951ae25f3 100644
--- a/tests/arc/tarcmisc.nim
+++ b/tests/arc/tarcmisc.nim
@@ -463,3 +463,14 @@ proc putValue[T](n: T) =
   echo b.n
 
 useForward()
+
+
+# bug #16246
+
+proc testWeirdTypeAliases() =
+  var values = newSeq[cuint](8)
+  # var values: seq[cuint] does not produce codegen error
+  var drawCb = proc(): seq[uint32] =
+    result = newSeq[uint32](10)
+
+testWeirdTypeAliases()