summary refs log tree commit diff stats
path: root/tests/overload/toverload_various.nim
diff options
context:
space:
mode:
authorRyan McConnell <rammcconnell@gmail.com>2024-07-24 17:59:45 -0400
committerGitHub <noreply@github.com>2024-07-24 23:59:45 +0200
commitc1f91c26a5136b2ad00f7da93b19c2da9b85dd16 (patch)
treea51308410d5baaba7a0348f0fa0bab345923a280 /tests/overload/toverload_various.nim
parentccf90f5bcbd6fd172ab8022925928999eddeffd8 (diff)
downloadNim-c1f91c26a5136b2ad00f7da93b19c2da9b85dd16.tar.gz
Overload resultion with generic variables an inheritance (#23870)
The test case diff is self explanatory
Diffstat (limited to 'tests/overload/toverload_various.nim')
-rw-r--r--tests/overload/toverload_various.nim60
1 files changed, 60 insertions, 0 deletions
diff --git a/tests/overload/toverload_various.nim b/tests/overload/toverload_various.nim
index 0741fce60..d195a069d 100644
--- a/tests/overload/toverload_various.nim
+++ b/tests/overload/toverload_various.nim
@@ -506,3 +506,63 @@ block:
   doAssert(p2(F(float,1.0),F(float,2)) == 3.0)
   doAssert(p2(F(float,1.0),F(float,2.0)) == 3.0)
   #doAssert(p2(F(float,1),F(int,2.0)) == 3.0)
+
+block: # PR #23870
+  type
+    A {.inheritable.} = object
+    B = object of A
+    C = object of B
+
+  proc p[T: A](x: T): int = 0
+  proc p[T: B](x: T): int = 1
+
+  proc d(x: A): int = 0
+  proc d(x: B): int = 1
+  
+  proc g[T:A](x: typedesc[T]): int = 0
+  proc g[T: B](x: typedesc[T]): int = 1
+  
+  proc f[T](x: typedesc[T]): int = 0
+  proc f[T:B](x: typedesc[T]): int = 1
+
+  assert p(C()) == 1
+  assert d(C()) == 1
+  assert g(C) == 1
+  assert f(C) == 1
+
+block: # PR #23870
+  type
+    A = object of RootObj
+    PT = proc(ev: A) {.closure.}
+    sdt = seq[(PT, PT)]
+
+  proc encap() =
+    proc p(a: A) {.closure.} =
+      discard
+
+    var s: sdt
+    s.add (p, nil)
+
+  encap()
+
+block: # PR #23870
+  type
+    A = object of RootObj
+    B = object of A
+    C = object of B
+
+  proc p(a: B | RootObj): int =
+    0
+
+  proc p(a: A | A): int =
+    1
+
+  assert p(C()) == 0
+
+  proc d(a: RootObj | B): int =
+    0
+
+  proc d(a: A | A): int =
+    1
+
+  assert d(C()) == 0