diff options
-rw-r--r-- | compiler/sigmatch.nim | 7 | ||||
-rw-r--r-- | tests/generics/tfakecovariance.nim | 11 |
2 files changed, 17 insertions, 1 deletions
diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim index d6a0c6382..db3775cca 100644 --- a/compiler/sigmatch.nim +++ b/compiler/sigmatch.nim @@ -956,6 +956,8 @@ proc typeRel(c: var TCandidate, f, aOrig: PType, doBind = true): TTypeRelation = case a.kind of tyOr: + # XXX: deal with the current dual meaning of tyGenericParam + c.typedescMatched = true # seq[int|string] vs seq[number] # both int and string must match against number # but ensure that '[T: A|A]' matches as good as '[T: A]' (bug #2219): @@ -964,15 +966,18 @@ proc typeRel(c: var TCandidate, f, aOrig: PType, doBind = true): TTypeRelation = let x = typeRel(c, f, branch, false) if x == isNone: return isNone if x < result: result = x + return of tyAnd: + # XXX: deal with the current dual meaning of tyGenericParam + c.typedescMatched = true # seq[Sortable and Iterable] vs seq[Sortable] # only one match is enough for branch in a.sons: let x = typeRel(c, f, branch, false) if x != isNone: return if x >= isGeneric: isGeneric else: x - result = isNone + return isNone of tyNot: case f.kind diff --git a/tests/generics/tfakecovariance.nim b/tests/generics/tfakecovariance.nim new file mode 100644 index 000000000..835acd9d3 --- /dev/null +++ b/tests/generics/tfakecovariance.nim @@ -0,0 +1,11 @@ +type + BaseObj = object of RootObj + DerivedObj = object of BaseObj + + Container[T] = object + +proc doSomething(c: Container[BaseObj or DerivedObj]) = discard + +var t: Container[DerivedObj] +doSomething t + |