parent
52cf728001
commit
fc9cf2088d
4 changed files with 49 additions and 4 deletions
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue