diff options
author | flywind <xzsflywind@gmail.com> | 2021-03-30 16:27:24 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-30 10:27:24 +0200 |
commit | 3715fc41d54ae5c139fba79f1f61419e320e8ba5 (patch) | |
tree | c0ee1b98680324b5f191cad3052ab27d9471d771 | |
parent | 40093b4a937d751ef43b5c2ca447677bb858dff4 (diff) | |
download | Nim-3715fc41d54ae5c139fba79f1f61419e320e8ba5.tar.gz |
fix #17512 (#17520)
-rw-r--r-- | compiler/ccgcalls.nim | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/compiler/ccgcalls.nim b/compiler/ccgcalls.nim index 64b883087..2a93cb5af 100644 --- a/compiler/ccgcalls.nim +++ b/compiler/ccgcalls.nim @@ -259,6 +259,10 @@ proc withTmpIfNeeded(p: BProc, a: TLoc, needsTmp: bool): TLoc = else: result = a +proc literalsNeedsTmp(p: BProc, a: TLoc): TLoc = + getTemp(p, a.lode.typ, result, needsInit=false) + genAssignment(p, result, a, {}) + proc genArgStringToCString(p: BProc, n: PNode, needsTmp: bool): Rope {.inline.} = var a: TLoc initLocExpr(p, n[0], a) @@ -273,7 +277,10 @@ proc genArg(p: BProc, n: PNode, param: PSym; call: PNode, needsTmp = false): Rop result = openArrayLoc(p, param.typ, n) elif ccgIntroducedPtr(p.config, param, call[0].typ[0]): initLocExpr(p, n, a) - result = addrLoc(p.config, withTmpIfNeeded(p, a, needsTmp)) + if n.kind in {nkCharLit..nkNilLit}: + result = addrLoc(p.config, literalsNeedsTmp(p, a)) + else: + result = addrLoc(p.config, withTmpIfNeeded(p, a, needsTmp)) elif p.module.compileToCpp and param.typ.kind in {tyVar} and n.kind == nkHiddenAddr: initLocExprSingleUse(p, n[0], a) |