summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/sigmatch.nim7
-rw-r--r--tests/generics/tfakecovariance.nim11
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
+