summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/sigmatch.nim4
-rw-r--r--tests/generics/tsubtypeconstraint.nim13
2 files changed, 17 insertions, 0 deletions
diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim
index 266236bf4..123d1df2e 100644
--- a/compiler/sigmatch.nim
+++ b/compiler/sigmatch.nim
@@ -936,6 +936,10 @@ proc typeRel(c: var TCandidate, f, aOrig: PType, doBind = true): TTypeRelation =
       else:
         if f.sonsLen > 0 and f.sons[0].kind != tyNone:
           result = typeRel(c, f.lastSon, a)
+          if doBind and result notin {isNone, isGeneric}:
+            let concrete = concreteType(c, a)
+            if concrete == nil: return isNone
+            put(c.bindings, f, concrete)
         else:
           result = isGeneric
 
diff --git a/tests/generics/tsubtypeconstraint.nim b/tests/generics/tsubtypeconstraint.nim
new file mode 100644
index 000000000..2f0954522
--- /dev/null
+++ b/tests/generics/tsubtypeconstraint.nim
@@ -0,0 +1,13 @@
+
+# bug #1684
+type
+  BaseType {.inheritable pure.} = object
+    idx: int
+
+  DerivedType* {.final pure.} = object of BaseType
+
+proc index*[Toohoo: BaseType](h: Toohoo): int {.inline.} = h.idx
+proc newDerived(idx: int): DerivedType {.inline.} = DerivedType(idx: idx)
+
+let d = newDerived(2)
+assert(d.index == 2)