diff options
-rw-r--r-- | compiler/semstmts.nim | 16 | ||||
-rw-r--r-- | tests/typerel/tcovariancerules.nim | 11 |
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 |