mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 08:54:53 +00:00
C++: ptr fields now pulls the whole type if it's a member in nkDotExpr (#22855)
This commit is contained in:
@@ -851,6 +851,12 @@ proc lookupFieldAgain(p: BProc, ty: PType; field: PSym; r: var Rope;
|
||||
|
||||
proc genRecordField(p: BProc, e: PNode, d: var TLoc) =
|
||||
var a: TLoc = default(TLoc)
|
||||
if p.module.compileToCpp and e.kind == nkDotExpr and e[1].kind == nkSym and e[1].typ.kind == tyPtr:
|
||||
# special case for C++: we need to pull the type of the field as member and friends require the complete type.
|
||||
let typ = e[1].typ[0]
|
||||
if typ.itemId in p.module.g.graph.memberProcsPerType:
|
||||
discard getTypeDesc(p.module, typ)
|
||||
|
||||
genRecordFieldAux(p, e, d, a)
|
||||
var r = rdLoc(a)
|
||||
var f = e[1].sym
|
||||
|
||||
@@ -115,4 +115,12 @@ proc test(self: Child): Box[Inner] {.virtual, asmnostackframe.} =
|
||||
{.emit:"return res;".}
|
||||
|
||||
|
||||
discard Child().test()
|
||||
discard Child().test()
|
||||
|
||||
import virtualptr
|
||||
|
||||
#We dont want to pull Loo directly by using it as we are testing that the pointer pulls it.
|
||||
proc makeMoo(): Moo {.importcpp:"{ new Loo() }".}
|
||||
|
||||
makeMoo().loo.salute()
|
||||
|
||||
|
||||
9
tests/cpp/virtualptr.nim
Normal file
9
tests/cpp/virtualptr.nim
Normal file
@@ -0,0 +1,9 @@
|
||||
type
|
||||
Loo* {.exportc.} = object
|
||||
LooPtr* = ptr Loo
|
||||
Moo* {.exportc.} = object
|
||||
loo*: LooPtr
|
||||
|
||||
|
||||
proc salute*(foo: LooPtr) {.virtual.} =
|
||||
discard
|
||||
Reference in New Issue
Block a user