mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-18 21:40:32 +00:00
[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]
This commit is contained in:
53
tests/cpp/tmember.nim
Normal file
53
tests/cpp/tmember.nim
Normal file
@@ -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()
|
||||
Reference in New Issue
Block a user