diff options
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/cgen.nim | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/compiler/cgen.nim b/compiler/cgen.nim index 25921e9f3..747494277 100644 --- a/compiler/cgen.nim +++ b/compiler/cgen.nim @@ -534,7 +534,15 @@ proc initLocExpr(p: BProc, e: PNode, result: var TLoc) = proc initLocExprSingleUse(p: BProc, e: PNode, result: var TLoc) = initLoc(result, locNone, e, OnUnknown) - result.flags.incl lfSingleUse + if e.kind in nkCallKinds and (e[0].kind != nkSym or e[0].sym.magic == mNone): + # We cannot check for tfNoSideEffect here because of mutable parameters. + discard "bug #8202; enforce evaluation order for nested calls for C++ too" + # We may need to consider that 'f(g())' cannot be rewritten to 'tmp = g(); f(tmp)' + # if 'tmp' lacks a move/assignment operator. + if e[0].kind == nkSym and sfConstructor in e[0].sym.flags: + result.flags.incl lfSingleUse + else: + result.flags.incl lfSingleUse expr(p, e, result) include ccgcalls, "ccgstmts.nim" |