diff options
-rw-r--r-- | compiler/sigmatch.nim | 8 | ||||
-rw-r--r-- | tests/generics/tptrinheritance.nim | 20 |
2 files changed, 25 insertions, 3 deletions
diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim index a8551fa19..d6a0c6382 100644 --- a/compiler/sigmatch.nim +++ b/compiler/sigmatch.nim @@ -1240,13 +1240,15 @@ proc typeRel(c: var TCandidate, f, aOrig: PType, doBind = true): TTypeRelation = if prev == nil: put(c, f, a) result = isGeneric else: - var aAsObject = roota.lastSon - if rootf.lastSon.kind in {tyAnd, tyOr}: + let fKind = rootf.lastSon.kind + if fKind in {tyAnd, tyOr}: result = typeRel(c, lastSon(f), a) if result != isNone: put(c, f, a) return - if rootf.lastSon.kind == tyRef and aAsObject.kind == tyRef: + var aAsObject = roota.lastSon + + if fKind in {tyRef, tyPtr} and aAsObject.kind == fKind: aAsObject = aAsObject.base if aAsObject.kind == tyObject: diff --git a/tests/generics/tptrinheritance.nim b/tests/generics/tptrinheritance.nim new file mode 100644 index 000000000..1e1115fa5 --- /dev/null +++ b/tests/generics/tptrinheritance.nim @@ -0,0 +1,20 @@ +type NSPasteboardItem* = ptr object +type NSPasteboard* = ptr object +type NSArrayAbstract = ptr object {.inheritable.} +type NSMutableArrayAbstract = ptr object of NSArrayAbstract +type NSArray*[T] = ptr object of NSArrayAbstract +type NSMutableArray*[T] = ptr object of NSArray[T] + +proc newMutableArrayAbstract*(): NSMutableArrayAbstract = discard + +template newMutableArray*(T: typedesc): NSMutableArray[T] = + cast[NSMutableArray[T]](newMutableArrayAbstract()) + +proc writeObjects*(p: NSPasteboard, o: ptr NSArray[NSPasteboardItem]) = discard + +let a = newMutableArray NSPasteboardItem +var x: NSMutableArray[NSPasteboardItem] +var y: NSArray[NSPasteboardItem] = x + +writeObjects(nil, a) + |