diff options
-rw-r--r-- | compiler/sigmatch.nim | 6 | ||||
-rw-r--r-- | tests/generics/mgenericprocmatcher.nim | 11 | ||||
-rw-r--r-- | tests/generics/tgenericprocmatcher.nim | 23 |
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 |