diff options
author | Mark Flamer <mflamer@vectorworks.net> | 2013-10-21 11:43:37 -0700 |
---|---|---|
committer | Mark Flamer <mflamer@vectorworks.net> | 2013-10-21 11:43:41 -0700 |
commit | 01e43fbe83608d4ed3ed529c995fa73e8c70bbe2 (patch) | |
tree | d48ad5263fb11d05604c74888ab8c9478f8aabf5 /compiler | |
parent | 40b379859c1f0775718a873a0ba58d32510855aa (diff) | |
download | Nim-01e43fbe83608d4ed3ed529c995fa73e8c70bbe2.tar.gz |
fix for Issue #626 - Distinct and generics not working together
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/types.nim | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/compiler/types.nim b/compiler/types.nim index f9c40e201..f5fb6555b 100644 --- a/compiler/types.nim +++ b/compiler/types.nim @@ -622,6 +622,8 @@ proc initSameTypeClosure: TSameTypeClosure = # we do the initialization lazily for performance (avoids memory allocations) nil + + proc containsOrIncl(c: var TSameTypeClosure, a, b: PType): bool = result = not IsNil(c.s) and c.s.contains((a.id, b.id)) if not result: @@ -750,9 +752,11 @@ template IfFastObjectTypeCheckFailed(a, b: PType, body: stmt) {.immediate.} = proc sameObjectTypes*(a, b: PType): bool = # specialized for efficiency (sigmatch uses it) - IfFastObjectTypeCheckFailed(a, b): + IfFastObjectTypeCheckFailed(a, b): var c = initSameTypeClosure() result = sameTypeAux(a, b, c) + + proc sameDistinctTypes*(a, b: PType): bool {.inline.} = result = sameObjectTypes(a, b) @@ -837,7 +841,7 @@ proc SameTypeAux(x, y: PType, c: var TSameTypeClosure): bool = result = sameObjectStructures(a, b, c) and sameFlags(a, b) of tyDistinct: CycleCheck() - if c.cmp == dcEq: result = sameDistinctTypes(a, b) and sameFlags(a, b) + if c.cmp == dcEq: result = sameTypeAux(a, b, c) and sameFlags(a, b) else: result = sameTypeAux(a.sons[0], b.sons[0], c) and sameFlags(a, b) of tyEnum, tyForward, tyProxy: # XXX generic enums do not make much sense, but require structural checking |