diff options
-rw-r--r-- | compiler/sigmatch.nim | 13 | ||||
-rw-r--r-- | tests/generics/tprevent_double_bind.nim | 21 |
2 files changed, 33 insertions, 1 deletions
diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim index d2ac311c8..978ee37fa 100644 --- a/compiler/sigmatch.nim +++ b/compiler/sigmatch.nim @@ -124,6 +124,12 @@ proc initCandidate*(ctx: PContext, c: var TCandidate, callee: PType) = initIdTable(c.bindings) proc put(c: var TCandidate, key, val: PType) {.inline.} = + when false: + let old = PType(idTableGet(c.bindings, key)) + if old != nil: + echo "Putting ", typeToString(key), " ", typeToString(val), " and old is ", typeToString(old) + if typeToString(old) == "seq[string]": + writeStackTrace() idTablePut(c.bindings, key, val.skipIntLit) proc initCandidate*(ctx: PContext, c: var TCandidate, callee: PSym, @@ -1520,7 +1526,12 @@ proc typeRelImpl(c: var TCandidate, f, aOrig: PType, elif x.kind in {tyGenericInvocation, tyGenericParam}: internalError(c.c.graph.config, "wrong instantiated type!") else: - put(c, f.sons[i], x) + let key = f.sons[i] + let old = PType(idTableGet(c.bindings, key)) + if old == nil: + put(c, key, x) + elif typeRel(c, old, x, flags + {trDontBind}) == isNone: + return isNone if result == isNone: # Here object inheriting from generic/specialized generic object diff --git a/tests/generics/tprevent_double_bind.nim b/tests/generics/tprevent_double_bind.nim new file mode 100644 index 000000000..86e080ab6 --- /dev/null +++ b/tests/generics/tprevent_double_bind.nim @@ -0,0 +1,21 @@ +discard """ + errormsg: "type mismatch: got <TT[seq[string]], proc (v: int){.gcsafe, locks: 0.}>" + line: 20 +""" + +# bug #6732 +import typetraits + +type + TT[T] = ref object of RootObj + val: T + CB[T] = proc (v: T) + +proc testGeneric[T](val: TT[T], cb: CB[T]) = + echo val.type.name + echo $val.val + +var tt = new(TT[seq[string]]) +echo tt.type.name +tt.testGeneric( proc (v: int) = + echo $v ) |