diff options
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/condsyms.nim | 1 | ||||
-rw-r--r-- | compiler/injectdestructors.nim | 8 | ||||
-rw-r--r-- | compiler/liftdestructors.nim | 10 | ||||
-rw-r--r-- | compiler/semstmts.nim | 7 |
4 files changed, 20 insertions, 6 deletions
diff --git a/compiler/condsyms.nim b/compiler/condsyms.nim index 9d9ba1605..4ff588852 100644 --- a/compiler/condsyms.nim +++ b/compiler/condsyms.nim @@ -155,3 +155,4 @@ proc initDefines*(symbols: StringTableRef) = defineSymbol("nimHasDup") defineSymbol("nimHasChecksums") defineSymbol("nimHasSendable") + defineSymbol("nimAllowNonVarDestructor") diff --git a/compiler/injectdestructors.nim b/compiler/injectdestructors.nim index f684aba5c..c5920f4b3 100644 --- a/compiler/injectdestructors.nim +++ b/compiler/injectdestructors.nim @@ -213,8 +213,12 @@ proc makePtrType(c: var Con, baseType: PType): PType = addSonSkipIntLit(result, baseType, c.idgen) proc genOp(c: var Con; op: PSym; dest: PNode): PNode = - let addrExp = newNodeIT(nkHiddenAddr, dest.info, makePtrType(c, dest.typ)) - addrExp.add(dest) + var addrExp: PNode + if op.typ != nil and op.typ.len > 1 and op.typ[1].kind != tyVar: + addrExp = dest + else: + addrExp = newNodeIT(nkHiddenAddr, dest.info, makePtrType(c, dest.typ)) + addrExp.add(dest) result = newTree(nkCall, newSymNode(op), addrExp) proc genOp(c: var Con; t: PType; kind: TTypeAttachedOp; dest, ri: PNode): PNode = diff --git a/compiler/liftdestructors.nim b/compiler/liftdestructors.nim index 865c18692..e40193481 100644 --- a/compiler/liftdestructors.nim +++ b/compiler/liftdestructors.nim @@ -140,7 +140,10 @@ proc genContainerOf(c: var TLiftCtx; objType: PType, field, x: PSym): PNode = proc destructorCall(c: var TLiftCtx; op: PSym; x: PNode): PNode = var destroy = newNodeIT(nkCall, x.info, op.typ[0]) destroy.add(newSymNode(op)) - destroy.add genAddr(c, x) + if op.typ[1].kind != tyVar: + destroy.add x + else: + destroy.add genAddr(c, x) if sfNeverRaises notin op.flags: c.canRaise = true if c.addMemReset: @@ -1115,7 +1118,7 @@ proc produceSym(g: ModuleGraph; c: PContext; typ: PType; kind: TTypeAttachedOp; fn: result) let dest = if kind == attachedDup: result.ast[resultPos].sym else: result.typ.n[1].sym - let d = if kind == attachedDup: newSymNode(dest) else: newDeref(newSymNode(dest)) + let d = if result.typ[1].kind == tyVar: newDeref(newSymNode(dest)) else: newSymNode(dest) let src = case kind of {attachedDestructor, attachedWasMoved}: newNodeIT(nkSym, info, getSysType(g, info, tyPointer)) of attachedDup: newSymNode(result.typ.n[1].sym) @@ -1127,7 +1130,8 @@ proc produceSym(g: ModuleGraph; c: PContext; typ: PType; kind: TTypeAttachedOp; if kind == attachedSink and destructorOverridden(g, typ): ## compiler can use a combination of `=destroy` and memCopy for sink op dest.flags.incl sfCursor - result.ast[bodyPos].add newOpCall(a, getAttachedOp(g, typ, attachedDestructor), d[0]) + let op = getAttachedOp(g, typ, attachedDestructor) + result.ast[bodyPos].add newOpCall(a, op, if op.typ[1].kind == tyVar: d[0] else: d) result.ast[bodyPos].add newAsgnStmt(d, src) else: var tk: TTypeKind diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index cf3c03039..34df83f46 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -1872,7 +1872,7 @@ proc bindTypeHook(c: PContext; s: PSym; n: PNode; op: TTypeAttachedOp) = let t = s.typ var noError = false let cond = case op - of {attachedDestructor, attachedWasMoved}: + of attachedWasMoved: t.len == 2 and t[0] == nil and t[1].kind == tyVar of attachedTrace: t.len == 3 and t[0] == nil and t[1].kind == tyVar and t[2].kind == tyPointer @@ -1887,6 +1887,8 @@ proc bindTypeHook(c: PContext; s: PSym; n: PNode; op: TTypeAttachedOp) = elif obj.kind == tyGenericInvocation: obj = obj[0] else: break if obj.kind in {tyObject, tyDistinct, tySequence, tyString}: + if op == attachedDestructor and t[1].kind == tyVar: + message(c.config, n.info, warnDeprecated, "A custom '=destroy' hook which takes a 'var T' parameter is deprecated; it should take a 'T' parameter") obj = canonType(c, obj) let ao = getAttachedOp(c.graph, obj, op) if ao == s: @@ -1904,6 +1906,9 @@ proc bindTypeHook(c: PContext; s: PSym; n: PNode; op: TTypeAttachedOp) = of attachedTrace: localError(c.config, n.info, errGenerated, "signature for '=trace' must be proc[T: object](x: var T; env: pointer)") + of attachedDestructor: + localError(c.config, n.info, errGenerated, + "signature for '=destroy' must be proc[T: object](x: var T) or proc[T: object](x: T)") else: localError(c.config, n.info, errGenerated, "signature for '" & s.name.s & "' must be proc[T: object](x: var T)") |