summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/semstmts.nim16
-rw-r--r--tests/typerel/tcovariancerules.nim11
2 files changed, 23 insertions, 4 deletions
diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim
index 4c1fbede3..10fc6fb6d 100644
--- a/compiler/semstmts.nim
+++ b/compiler/semstmts.nim
@@ -867,6 +867,22 @@ proc typeSectionRightSidePass(c: PContext, n: PNode) =
         s.typ.sons[sonsLen(s.typ) - 1] = body
         if sfCovariant in s.flags:
           checkCovariantParamsUsages(s.typ)
+          # XXX: This is a temporary limitation:
+          # The codegen currently produces various failures with
+          # generic imported types that have fields, but we need
+          # the fields specified in order to detect weak covariance.
+          # The proper solution is to teach the codegen how to handle
+          # such types, because this would offer various interesting
+          # possibilities such as instantiating C++ generic types with
+          # garbage collected Nim types.
+          if sfImportc in s.flags:
+            var body = s.typ.lastSon
+            if body.kind == tyObject:
+              # erases all declared fields
+              body.n.sons = nil
+
+          debug s.typ
+          echo s.typ[0].sym.flags
 
       popOwner(c)
       closeScope(c)
diff --git a/tests/typerel/tcovariancerules.nim b/tests/typerel/tcovariancerules.nim
index 7cd5d5066..dfe4cb941 100644
--- a/tests/typerel/tcovariancerules.nim
+++ b/tests/typerel/tcovariancerules.nim
@@ -44,7 +44,7 @@ template acceptWithCovariance(x, otherwise): typed =
     skipElse(otherwise)
 
 type
-  Animal = object of TObject
+  Animal = object of RootObj
     x: string
 
   Dog = object of Animal
@@ -302,12 +302,15 @@ reject wantsVarPointer2(pcat)
 
 {.emit: """
 template <class T> struct FN { typedef void (*type)(T); };
-template <class T> struct ARR { typedef T type[2]; };
+template <class T> struct ARR { typedef T DataType[2]; DataType data; };
 """.}
 
 type
-  MyPtr {.importcpp: "'0 *"} [out T] = distinct ptr T
-  MySeq {.importcpp: "ARR<'0>::type"} [out T] = object
+  MyPtr {.importcpp: "'0 *"} [out T] = object
+
+  MySeq {.importcpp: "ARR<'0>", nodecl} [out T] = object
+    data: array[2, T]
+
   MyAction {.importcpp: "FN<'0>::type"} [in T] = object
 
 var