diff options
author | Juan M Gómez <info@jmgomez.me> | 2023-08-07 09:11:00 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-07 10:11:00 +0200 |
commit | b5b4b48c942b23991c8d11f41dc39b7e211e5b2e (patch) | |
tree | 625795a000486f2abab0beda5497a944ef641f87 /tests/cpp/tmember.nim | |
parent | fe9ae2c69adc39cd170b4bd31221fb66135fd571 (diff) | |
download | Nim-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.nim | 53 |
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() |