From f22d3c75aa68833ae1b01d747d0c71074ccef310 Mon Sep 17 00:00:00 2001 From: Araq Date: Wed, 13 Nov 2019 19:55:05 +0100 Subject: [PATCH] ARC: closure inside object constructor now works --- compiler/injectdestructors.nim | 17 +++++++++++++++-- tests/destructor/tlists.nim | 15 ++++++++++++++- tests/destructor/tuse_ownedref_after_move.nim | 2 +- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/compiler/injectdestructors.nim b/compiler/injectdestructors.nim index 08d27f77c3..8d975e69ef 100644 --- a/compiler/injectdestructors.nim +++ b/compiler/injectdestructors.nim @@ -382,9 +382,16 @@ proc pArg(arg: PNode; c: var Con; isSink: bool): PNode = # sink parameter (bug #11524). Note that the string implementation is # different and can deal with 'const string sunk into var'. result = passCopyToSink(arg, c) - elif arg.kind in {nkBracket, nkObjConstr, nkTupleConstr, nkClosure} + nkLiterals: + elif arg.kind in nkLiterals: + result = arg # literal to sink parameter: nothing to do + elif arg.kind in {nkBracket, nkObjConstr, nkTupleConstr, nkClosure}: # object construction to sink parameter: nothing to do - result = arg + result = copyTree(arg) + for i in ord(arg.kind in {nkObjConstr, nkClosure})..