summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/ccgexprs.nim3
-rw-r--r--compiler/semstmts.nim3
-rw-r--r--tests/concepts/t6462.nim23
3 files changed, 27 insertions, 2 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim
index da92b281e..5a25a9853 100644
--- a/compiler/ccgexprs.nim
+++ b/compiler/ccgexprs.nim
@@ -683,9 +683,10 @@ proc genDeref(p: BProc, e: PNode, d: var TLoc; enforceDeref=false) =
       d.storage = OnHeap
   else:
     var a: TLoc
-    var typ = skipTypes(e.sons[0].typ, abstractInst)
+    var typ = e.sons[0].typ
     if typ.kind in {tyUserTypeClass, tyUserTypeClassInst} and typ.isResolvedUserTypeClass:
       typ = typ.lastSon
+    typ = typ.skipTypes(abstractInst)
     if typ.kind == tyVar and tfVarIsPtr notin typ.flags and p.module.compileToCpp and e.sons[0].kind == nkHiddenAddr:
       initLocExprSingleUse(p, e[0][0], d)
       return
diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim
index c85de35cd..8ed120c98 100644
--- a/compiler/semstmts.nim
+++ b/compiler/semstmts.nim
@@ -441,9 +441,10 @@ proc hasEmpty(typ: PType): bool =
       result = result or hasEmpty(s)
 
 proc makeDeref(n: PNode): PNode =
-  var t = skipTypes(n.typ, {tyGenericInst, tyAlias})
+  var t = n.typ
   if t.kind in tyUserTypeClasses and t.isResolvedUserTypeClass:
     t = t.lastSon
+  t = skipTypes(t, {tyGenericInst, tyAlias})
   result = n
   if t.kind == tyVar:
     result = newNodeIT(nkHiddenDeref, n.info, t.sons[0])
diff --git a/tests/concepts/t6462.nim b/tests/concepts/t6462.nim
new file mode 100644
index 000000000..2fa2268f8
--- /dev/null
+++ b/tests/concepts/t6462.nim
@@ -0,0 +1,23 @@
+discard """
+  output: "true"
+"""
+
+import future
+
+type
+  FilterMixin*[T] = ref object
+    test*:      (T) -> bool
+    trans*:     (T) -> T
+
+  SeqGen*[T] = ref object
+    fil*:     FilterMixin[T]
+  
+  WithFilter[T] = concept a
+    a.fil is FilterMixin[T]
+
+proc test*[T](a: WithFilter[T]): (T) -> bool =
+  a.fil.test
+
+var s = SeqGen[int](fil: FilterMixin[int](test: nil, trans: nil))
+echo s.test() == nil
+