handle 'T&' properly for better C++ support

This commit is contained in:
Araq 2015-01-13 22:30:56 +01:00
commit 8889fa9117

View file

@ -229,6 +229,9 @@ proc genInfixCall(p: BProc, le, ri: PNode, d: var TLoc) =
assert(sonsLen(typ) == sonsLen(typ.n)) assert(sonsLen(typ) == sonsLen(typ.n))
var param = typ.n.sons[1].sym var param = typ.n.sons[1].sym
if typ.sons[1].kind == tyVar and ri.sons[1].kind == nkHiddenAddr:
app(pl, genArgNoParam(p, ri.sons[1][0]))
else:
app(pl, genArg(p, ri.sons[1], param)) app(pl, genArg(p, ri.sons[1], param))
if skipTypes(param.typ, {tyGenericInst}).kind == tyPtr: app(pl, ~"->") if skipTypes(param.typ, {tyGenericInst}).kind == tyPtr: app(pl, ~"->")
@ -239,7 +242,12 @@ proc genInfixCall(p: BProc, le, ri: PNode, d: var TLoc) =
if params != nil: params.app(~", ") if params != nil: params.app(~", ")
assert(sonsLen(typ) == sonsLen(typ.n)) assert(sonsLen(typ) == sonsLen(typ.n))
if i < sonsLen(typ): if i < sonsLen(typ):
# 'var T' is 'T&' in C++. This means we ignore the request of
# any nkHiddenAddr when it's a 'var T'.
assert(typ.n.sons[i].kind == nkSym) assert(typ.n.sons[i].kind == nkSym)
if typ.sons[i].kind == tyVar and ri.sons[i].kind == nkHiddenAddr:
app(params, genArgNoParam(p, ri.sons[i][0]))
else:
app(params, genArg(p, ri.sons[i], typ.n.sons[i].sym)) app(params, genArg(p, ri.sons[i], typ.n.sons[i].sym))
else: else:
app(params, genArgNoParam(p, ri.sons[i])) app(params, genArgNoParam(p, ri.sons[i]))