summary refs log tree commit diff stats
path: root/tests/objects/tobject3.nim
diff options
context:
space:
mode:
Diffstat (limited to 'tests/objects/tobject3.nim')
-rw-r--r--tests/objects/tobject3.nim95
1 files changed, 95 insertions, 0 deletions
diff --git a/tests/objects/tobject3.nim b/tests/objects/tobject3.nim
new file mode 100644
index 000000000..9ff1743ce
--- /dev/null
+++ b/tests/objects/tobject3.nim
@@ -0,0 +1,95 @@
+discard """
+  output: '''TBar2
+TFoo
+'''
+"""
+
+## XXX this output needs to be adapted for VCC which produces different results.
+
+# It turned out that it's hard to generate correct for these two test cases at
+# the same time.
+
+type
+  TFoo = ref object of RootObj
+    Data: int
+  TBar = ref object of TFoo
+    nil
+  TBar2 = ref object of TBar
+    d2: int
+
+template super(self: TBar): TFoo = self
+
+template super(self: TBar2): TBar = self
+
+proc Foo(self: TFoo) =
+  echo "TFoo"
+
+#proc Foo(self: TBar) =
+#  echo "TBar"
+#  Foo(super(self))
+# works when this code is uncommented
+
+proc Foo(self: TBar2) =
+  echo "TBar2"
+  Foo(super(self))
+
+var b: TBar2
+new(b)
+
+Foo(b)
+
+# bug #837
+type
+  PView* = ref TView
+  TView* {.inheritable.} = object
+    data: int
+
+  PWindow* = ref TWindow
+  TWindow* = object of TView
+    data3: int
+
+  PDesktop* = ref TDesktop
+  TDesktop* = object of TView
+    data2: int
+
+proc makeDesktop(): PDesktop = new(TDesktop)
+
+proc makeWindow(): PWindow = new(TWindow)
+
+proc thisCausesError(a: PView, b: PView) =
+  discard
+
+var dd = makeDesktop()
+var aa = makeWindow()
+
+thisCausesError(dd, aa)
+
+# bug  #5892
+type
+    Foo6 = distinct array[4, float32]
+    AnotherFoo = distinct array[4, float32]
+
+    AbstractAnimationSampler* = ref object of RootObj
+
+    AnimationSampler*[T] = ref object of AbstractAnimationSampler
+        sampleImpl: proc(s: AnimationSampler[T], p: float): T
+
+    ArrayAnimationSampler*[T] = ref object of AnimationSampler[T]
+
+proc newArrayAnimationSampler*[T](): ArrayAnimationSampler[T] =
+    result.new()
+    result.sampleImpl = nil
+
+discard newArrayAnimationSampler[Foo6]()
+discard newArrayAnimationSampler[AnotherFoo]()
+
+type
+  DefaultIsNone* = pointer | ptr | ref | proc {.nimcall.} | cstring | cstringArray
+  OptionKind* {.pure.} = enum None, Some
+  OptionA* [T] = object of RootObj
+    when T is DefaultIsNone:
+      value: T
+    else:
+      value: T
+      kind: OptionKind
+  SomeA* [T] = object of OptionA[T]