mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-29 01:14:41 +00:00
* [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]
54 lines
1017 B
Nim
54 lines
1017 B
Nim
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()
|