diff options
author | cooldome <cdome@bk.ru> | 2019-12-06 08:56:54 +0000 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2019-12-06 09:56:54 +0100 |
commit | 7213969901a4232013a6e6732d7b434970922510 (patch) | |
tree | bfc275eba678c10040345b43fbed38197d1db144 | |
parent | 1db21721ec816e01ef91633941e0295f7724e1f7 (diff) | |
download | Nim-7213969901a4232013a6e6732d7b434970922510.tar.gz |
fixes #12821 (#12822)
-rw-r--r-- | compiler/enumtostr.nim | 15 | ||||
-rw-r--r-- | tests/destructor/tcaseobj_transitions.nim | 16 |
2 files changed, 26 insertions, 5 deletions
diff --git a/compiler/enumtostr.nim b/compiler/enumtostr.nim index 35bf64a49..42d844609 100644 --- a/compiler/enumtostr.nim +++ b/compiler/enumtostr.nim @@ -41,20 +41,26 @@ proc genEnumToStrProc*(t: PType; info: TLineInfo; g: ModuleGraph): PSym = result.ast = n incl result.flags, sfFromGeneric -proc searchObjCase(obj: PNode; field: PSym): PNode = +proc searchObjCaseImpl(obj: PNode; field: PSym): PNode = case obj.kind of nkSym: result = nil of nkElse, nkOfBranch: - result = searchObjCase(obj.lastSon, field) + result = searchObjCaseImpl(obj.lastSon, field) else: if obj.kind == nkRecCase and obj[0].kind == nkSym and obj[0].sym == field: result = obj else: for x in obj: - result = searchObjCase(x, field) + result = searchObjCaseImpl(x, field) if result != nil: break +proc searchObjCase(t: PType; field: PSym): PNode = + result = searchObjCaseImpl(t.n, field) + if result == nil and t.len > 0: + result = searchObjCase(t[0].skipTypes({tyAlias, tyGenericInst, tyRef, tyPtr}), field) + doAssert result != nil + proc genCaseObjDiscMapping*(t: PType; field: PSym; info: TLineInfo; g: ModuleGraph): PSym = result = newSym(skProc, getIdent(g.cache, "objDiscMapping"), t.owner, info) @@ -75,8 +81,7 @@ proc genCaseObjDiscMapping*(t: PType; field: PSym; info: TLineInfo; g: ModuleGra var caseStmt = newNodeI(nkCaseStmt, info) caseStmt.add(newSymNode dest) - let subObj = searchObjCase(t.n, field) - doAssert subObj != nil + let subObj = searchObjCase(t, field) for i in 1..<subObj.len: let ofBranch = subObj[i] var newBranch = newNodeI(ofBranch.kind, ofBranch.info) diff --git a/tests/destructor/tcaseobj_transitions.nim b/tests/destructor/tcaseobj_transitions.nim index 9377d57b0..4e203f4ef 100644 --- a/tests/destructor/tcaseobj_transitions.nim +++ b/tests/destructor/tcaseobj_transitions.nim @@ -31,3 +31,19 @@ var y = MyCaseObjectB(kind: A) y.x = 1 y.kind = C echo "no crash" + + +################# +## bug #12821 + +type + RefBaseObject* = ref object of RootObj + case kind: bool + of true: a: int + of false: b: float + + MyRefObject = ref object of RefBaseObject + x: float + +let z = new(MyRefObject) +z.kind = false |