mirror of
https://github.com/nim-lang/Nim.git
synced 2026-06-10 05:38:10 +00:00
@@ -1330,7 +1330,7 @@ proc genHook(m: BModule; t: PType; info: TLineInfo; op: TTypeAttachedOp): Rope =
|
||||
|
||||
proc genTypeInfoV2Impl(m: BModule, t, origType: PType, name: Rope; info: TLineInfo) =
|
||||
var typeName: Rope
|
||||
if t.kind == tyObject:
|
||||
if t.kind in {tyObject, tyDistinct}:
|
||||
if incompleteType(t):
|
||||
localError(m.config, info, "request for RTTI generation for incomplete object: " &
|
||||
typeToString(t))
|
||||
@@ -1353,7 +1353,8 @@ proc genTypeInfoV2Impl(m: BModule, t, origType: PType, name: Rope; info: TLineIn
|
||||
|
||||
proc genTypeInfoV2(m: BModule, t: PType; info: TLineInfo): Rope =
|
||||
let origType = t
|
||||
var t = skipTypes(origType, irrelevantForBackend + tyUserTypeClasses)
|
||||
# distinct types can have their own destructors
|
||||
var t = skipTypes(origType, irrelevantForBackend + tyUserTypeClasses - {tyDistinct})
|
||||
|
||||
let prefixTI = if m.hcrOn: "(" else: "(&"
|
||||
|
||||
|
||||
@@ -361,7 +361,7 @@ proc considerAsgnOrSink(c: var TLiftCtx; t: PType; body, x, y: PNode;
|
||||
result = true
|
||||
|
||||
proc addDestructorCall(c: var TLiftCtx; orig: PType; body, x: PNode) =
|
||||
let t = orig.skipTypes(abstractInst)
|
||||
let t = orig.skipTypes(abstractInst - {tyDistinct})
|
||||
var op = t.destructor
|
||||
|
||||
if op != nil and sfOverriden in op.flags:
|
||||
|
||||
@@ -524,6 +524,7 @@ proc transformConv(c: PTransf, n: PNode): PNode =
|
||||
result[0] = transform(c, n[1])
|
||||
else:
|
||||
result = transform(c, n[1])
|
||||
result.typ = n.typ
|
||||
else:
|
||||
result = transformSons(c, n)
|
||||
of tyObject:
|
||||
@@ -536,6 +537,7 @@ proc transformConv(c: PTransf, n: PNode): PNode =
|
||||
result[0] = transform(c, n[1])
|
||||
else:
|
||||
result = transform(c, n[1])
|
||||
result.typ = n.typ
|
||||
of tyGenericParam, tyOrdinal:
|
||||
result = transform(c, n[1])
|
||||
# happens sometimes for generated assignments, etc.
|
||||
|
||||
@@ -125,4 +125,46 @@ proc main =
|
||||
let rankdef = avals
|
||||
echo avals.len, " ", rankdef.len
|
||||
|
||||
main()
|
||||
main()
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Issue #16722, ref on distinct type, wrong destructors called
|
||||
#------------------------------------------------------------------------------
|
||||
|
||||
type
|
||||
Obj = object of RootObj
|
||||
ObjFinal = object
|
||||
ObjRef = ref Obj
|
||||
ObjFinalRef = ref ObjFinal
|
||||
D = distinct Obj
|
||||
DFinal = distinct ObjFinal
|
||||
DRef = ref D
|
||||
DFinalRef = ref DFinal
|
||||
|
||||
proc `=destroy`(o: var Obj) =
|
||||
doAssert false, "no Obj is constructed in this sample"
|
||||
|
||||
proc `=destroy`(o: var ObjFinal) =
|
||||
doAssert false, "no ObjFinal is constructed in this sample"
|
||||
|
||||
var dDestroyed: int
|
||||
proc `=destroy`(d: var D) =
|
||||
dDestroyed.inc
|
||||
|
||||
proc `=destroy`(d: var DFinal) =
|
||||
dDestroyed.inc
|
||||
|
||||
func newD(): DRef =
|
||||
DRef ObjRef()
|
||||
|
||||
func newDFinal(): DFinalRef =
|
||||
DFinalRef ObjFinalRef()
|
||||
|
||||
proc testRefs() =
|
||||
discard newD()
|
||||
discard newDFinal()
|
||||
|
||||
testRefs()
|
||||
|
||||
doAssert(dDestroyed == 2)
|
||||
|
||||
Reference in New Issue
Block a user