diff --git a/compiler/liftdestructors.nim b/compiler/liftdestructors.nim index e401934815..c25f089fde 100644 --- a/compiler/liftdestructors.nim +++ b/compiler/liftdestructors.nim @@ -1068,7 +1068,12 @@ proc symPrototype(g: ModuleGraph; typ: PType; owner: PSym; kind: TTypeAttachedOp let dest = newSym(skParam, getIdent(g.cache, "dest"), idgen, result, info) let src = newSym(skParam, getIdent(g.cache, if kind == attachedTrace: "env" else: "src"), idgen, result, info) - dest.typ = makeVarType(typ.owner, typ, idgen) + + if kind == attachedDestructor and typ.kind == tyRef: + dest.typ = typ + else: + dest.typ = makeVarType(typ.owner, typ, idgen) + if kind == attachedTrace: src.typ = getSysType(g, info, tyPointer) else: diff --git a/lib/system.nim b/lib/system.nim index 2290ff6f6a..d4835b20b9 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -365,6 +365,10 @@ proc arrGet[I: Ordinal;T](a: T; i: I): T {. proc arrPut[I: Ordinal;T,S](a: T; i: I; x: S) {.noSideEffect, magic: "ArrPut".} +when defined(nimAllowNonVarDestructor): + proc `=destroy`*[T](x: ref T) {.inline, magic: "Destroy".} = + discard + proc `=destroy`*[T](x: var T) {.inline, magic: "Destroy".} = ## Generic `destructor`:idx: implementation that can be overridden. discard diff --git a/tests/config.nims b/tests/config.nims index 842459c3a8..b288bec2ae 100644 --- a/tests/config.nims +++ b/tests/config.nims @@ -43,3 +43,4 @@ switch("define", "nimPreviewRangeDefault") switch("warningAserror", "UnnamedBreak") switch("legacy", "verboseTypeMismatch") +