summary refs log tree commit diff stats
path: root/tests/cpp/tmember.nim
diff options
context:
space:
mode:
authorJuan M Gómez <info@jmgomez.me>2023-08-07 09:11:00 +0100
committerGitHub <noreply@github.com>2023-08-07 10:11:00 +0200
commitb5b4b48c942b23991c8d11f41dc39b7e211e5b2e (patch)
tree625795a000486f2abab0beda5497a944ef641f87 /tests/cpp/tmember.nim
parentfe9ae2c69adc39cd170b4bd31221fb66135fd571 (diff)
downloadNim-b5b4b48c942b23991c8d11f41dc39b7e211e5b2e.tar.gz
[C++] Member pragma RFC (https://github.com/nim-lang/RFCs/issues/530) (#22272)
* [C++] Member pragma RFC #530
rebase devel

* changes the test so `echo` is not used before Nim is init

* rebase devel

* fixes Error: use explicit initialization of X for clarity [Uninit]
Diffstat (limited to 'tests/cpp/tmember.nim')
-rw-r--r--tests/cpp/tmember.nim53
1 files changed, 53 insertions, 0 deletions
diff --git a/tests/cpp/tmember.nim b/tests/cpp/tmember.nim
new file mode 100644
index 000000000..3f498c722
--- /dev/null
+++ b/tests/cpp/tmember.nim
@@ -0,0 +1,53 @@
+discard """
+  targets: "cpp"
+  cmd: "nim cpp $file"
+  output: '''
+2
+false
+hello foo
+hello boo
+hello boo
+destructing
+destructing
+'''
+"""
+proc print(s: cstring) {.importcpp:"printf(@)", header:"<stdio.h>".}
+
+type
+  Doo  {.exportc.} = object
+    test: int
+
+proc memberProc(f: Doo) {.exportc, member.} = 
+  echo $f.test
+
+proc destructor(f: Doo) {.member: "~'1()", used.} = 
+  print "destructing\n"
+
+proc `==`(self, other: Doo): bool {.member:"operator==('2 const & #2) const -> '0"} = 
+  self.test == other.test
+
+let doo = Doo(test: 2)
+doo.memberProc()
+echo doo == Doo(test: 1)
+
+#virtual
+proc newCpp*[T](): ptr T {.importcpp:"new '*0()".}
+type 
+  Foo = object of RootObj
+  FooPtr = ptr Foo
+  Boo = object of Foo
+  BooPtr = ptr Boo
+
+proc salute(self: FooPtr) {.member: "virtual $1()".} = 
+  echo "hello foo"
+
+proc salute(self: BooPtr) {.member: "virtual $1()".} =
+  echo "hello boo"
+
+let foo = newCpp[Foo]()
+let boo = newCpp[Boo]()
+let booAsFoo = cast[FooPtr](newCpp[Boo]())  
+
+foo.salute()
+boo.salute()
+booAsFoo.salute()