summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/sigmatch.nim6
-rw-r--r--tests/generics/mgenericprocmatcher.nim11
-rw-r--r--tests/generics/tgenericprocmatcher.nim23
3 files changed, 39 insertions, 1 deletions
diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim
index 40836a94d..97a059dbe 100644
--- a/compiler/sigmatch.nim
+++ b/compiler/sigmatch.nim
@@ -158,11 +158,15 @@ proc sumGeneric(t: PType): int =
       t = t.sons[0]
       inc result
       inc isvar
+    of tyTypeDesc:
+      t = t.lastSon
+      if t.kind == tyEmpty: break
+      inc result
     of tyGenericInvocation, tyTuple:
       result += ord(t.kind == tyGenericInvocation)
       for i in 0 .. <t.len: result += t.sons[i].sumGeneric
       break
-    of tyGenericParam, tyExpr, tyStatic, tyStmt, tyTypeDesc: break
+    of tyGenericParam, tyExpr, tyStatic, tyStmt: break
     of tyBool, tyChar, tyEnum, tyObject, tyProc, tyPointer,
         tyString, tyCString, tyInt..tyInt64, tyFloat..tyFloat128,
         tyUInt..tyUInt64:
diff --git a/tests/generics/mgenericprocmatcher.nim b/tests/generics/mgenericprocmatcher.nim
new file mode 100644
index 000000000..92805fb7b
--- /dev/null
+++ b/tests/generics/mgenericprocmatcher.nim
@@ -0,0 +1,11 @@
+import tables
+
+type
+  FFoo* = object
+  FBar* = object
+
+proc new*(_: typedesc[FFoo]): int = 2
+proc new*[T](_: typedesc[T]): int = 3
+proc new*(_: typedesc): int = 4
+proc new*(_: typedesc[seq[Table[int, seq[Table[int, string]]]]]): int = 5
+proc new*(_: typedesc[seq[Table[int, seq[Table[int, typedesc]]]]]): int = 6
diff --git a/tests/generics/tgenericprocmatcher.nim b/tests/generics/tgenericprocmatcher.nim
new file mode 100644
index 000000000..dfffdb87c
--- /dev/null
+++ b/tests/generics/tgenericprocmatcher.nim
@@ -0,0 +1,23 @@
+discard """
+  exitcode: 0
+"""
+import mgenericprocmatcher
+import tables
+
+type
+  LFoo = object
+  LBar = object
+
+
+when isMainModule:
+  doAssert FBar.new() == 3
+
+  proc new(_: typedesc[LFoo]): int = 0
+  proc new[T](_: typedesc[T]): int = 1
+  proc new*(_: typedesc[seq[Table[int, seq[Table[int, typedesc]]]]]): int = 7
+
+  doAssert LFoo.new() == 0     # Tests selecting more precise type
+  doAssert LBar.new() == 1     # Tests preferring function from local scope
+  doAssert FBar.new() == 1
+  doAssert FFoo.new() == 2     # Tests selecting more precise type from other module
+  doAssert seq[Table[int, seq[Table[int, string]]]].new() == 5     # Truly complex type test