mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-30 09:54:49 +00:00
work-around for defining imported types with weak covariance
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user