diff options
-rw-r--r-- | compiler/astalgo.nim | 2 | ||||
-rw-r--r-- | compiler/ccgtypes.nim | 2 | ||||
-rw-r--r-- | compiler/sighashes.nim | 12 | ||||
-rw-r--r-- | tests/concepts/tconceptinclosure.nim | 33 |
4 files changed, 37 insertions, 12 deletions
diff --git a/compiler/astalgo.nim b/compiler/astalgo.nim index f8435f359..1fc8b7cea 100644 --- a/compiler/astalgo.nim +++ b/compiler/astalgo.nim @@ -81,6 +81,8 @@ template mdbg*: bool {.dirty.} = p.lex.fileIdx == gProjectMainIdx else: p.module.module.fileIdx == gProjectMainIdx + elif compiles(m.module.fileIdx): + m.module.fileIdx == gProjectMainIdx elif compiles(L.fileIdx): L.fileIdx == gProjectMainIdx else: diff --git a/compiler/ccgtypes.nim b/compiler/ccgtypes.nim index f1e32fd1e..5e4bcfe97 100644 --- a/compiler/ccgtypes.nim +++ b/compiler/ccgtypes.nim @@ -1094,7 +1094,7 @@ proc genDeepCopyProc(m: BModule; s: PSym; result: Rope) = proc genTypeInfo(m: BModule, t: PType): Rope = let origType = t - var t = skipTypes(origType, irrelevantForBackend) + var t = skipTypes(origType, irrelevantForBackend + tyUserTypeClasses) let sig = hashType(origType) result = m.typeInfoMarker.getOrDefault(sig) diff --git a/compiler/sighashes.nim b/compiler/sighashes.nim index fd703a433..6eecf98d8 100644 --- a/compiler/sighashes.nim +++ b/compiler/sighashes.nim @@ -154,7 +154,7 @@ proc hashType(c: var MD5Context, t: PType; flags: set[ConsiderFlag]) = else: c.hashSym(t.sym) return - of tyAlias, tyGenericInst: + of tyAlias, tyGenericInst, tyUserTypeClasses: c.hashType t.lastSon, flags return else: @@ -201,16 +201,6 @@ proc hashType(c: var MD5Context, t: PType; flags: set[ConsiderFlag]) = of tyRef, tyPtr, tyGenericBody, tyVar: c.hashType t.lastSon, flags if tfVarIsPtr in t.flags: c &= ".varisptr" - of tyUserTypeClass: - if t.sym != nil and t.sym.owner != nil: - c &= t.sym.owner.name.s - else: - c &= "unknown typeclass" - of tyUserTypeClassInst: - let body = t.sons[0] - c.hashSym body.sym - for i in countup(1, sonsLen(t) - 2): - c.hashType t.sons[i], flags of tyFromExpr, tyFieldAccessor: c.hashTree(t.n) of tyTuple: diff --git a/tests/concepts/tconceptinclosure.nim b/tests/concepts/tconceptinclosure.nim new file mode 100644 index 000000000..ccd19d201 --- /dev/null +++ b/tests/concepts/tconceptinclosure.nim @@ -0,0 +1,33 @@ +discard """ + output: "10\n20" +""" + +type + FonConcept = concept x + x.x is int + + Implementation = object + x: int + + Closure = object + f: proc() + +proc f1(x: FonConcept): Closure = + result.f = proc () = + echo x.x + +proc f2(x: FonConcept): Closure = + result.f = proc () = + echo x.x + +let x = Implementation(x: 10) +let y = Implementation(x: 20) + +let a = x.f1 +let b = x.f2 +let c = x.f1 +let d = y.f2 + +a.f() +d.f() + |