summary refs log tree commit diff stats
path: root/tests/objects/tobjcov.nim
diff options
context:
space:
mode:
Diffstat (limited to 'tests/objects/tobjcov.nim')
-rw-r--r--tests/objects/tobjcov.nim24
1 files changed, 24 insertions, 0 deletions
diff --git a/tests/objects/tobjcov.nim b/tests/objects/tobjcov.nim
new file mode 100644
index 000000000..a12f74702
--- /dev/null
+++ b/tests/objects/tobjcov.nim
@@ -0,0 +1,24 @@
+discard """
+action: compile
+targets: "c"
+"""
+
+# Covariance is not type safe:
+# Note: `nim cpp` makes it a compile error (after codegen), even with:
+# `var f = cast[proc (x: var TA) {.nimcall.}](cast[pointer](bp))`, which
+# currently removes all the `cast` in cgen'd code, hence the compile error.
+
+type
+  TA = object of RootObj
+    a: int
+  TB = object of TA
+    b: array[0..5000_000, int]
+
+proc ap(x: var TA) = x.a = -1
+proc bp(x: var TB) = x.b[high(x.b)] = -1
+
+# in Nim proc (x: TB) is compatible to proc (x: TA),
+# but this is not type safe:
+var f = cast[proc (x: var TA) {.nimcall.}](bp)
+var a: TA
+f(a) # bp expects a TB, but gets a TA