diff options
-rw-r--r-- | compiler/semstmts.nim | 9 | ||||
-rw-r--r-- | compiler/semtypes.nim | 2 | ||||
-rw-r--r-- | tests/compile/tinheritref.nim | 27 |
3 files changed, 34 insertions, 4 deletions
diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index 0ee950faf..7e69dbd92 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -775,9 +775,12 @@ proc typeSectionFinalPass(c: PContext, n: PNode) = if aa.kind in {nkRefTy, nkPtrTy} and aa.len == 1 and aa.sons[0].kind == nkObjectTy: # give anonymous object a dummy symbol: - assert s.typ.sons[0].sym == nil - s.typ.sons[0].sym = newSym(skType, getIdent(s.name.s & ":ObjectType"), - getCurrOwner(), s.info) + var st = s.typ + if st.kind == tyGenericBody: st = st.lastSon + InternalAssert st.kind in {tyPtr, tyRef} + InternalAssert st.sons[0].sym == nil + st.sons[0].sym = newSym(skType, getIdent(s.name.s & ":ObjectType"), + getCurrOwner(), s.info) proc SemTypeSection(c: PContext, n: PNode): PNode = typeSectionLeftSidePass(c, n) diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim index b02fa7c31..14f96497d 100644 --- a/compiler/semtypes.nim +++ b/compiler/semtypes.nim @@ -558,7 +558,7 @@ proc semObjectNode(c: PContext, n: PNode, prev: PType): PType = checkSonsLen(n, 3) if n.sons[1].kind != nkEmpty: base = skipTypes(semTypeNode(c, n.sons[1].sons[0], nil), skipPtrs) - var concreteBase = skipGenericInvokation(base) + var concreteBase = skipGenericInvokation(base).skipTypes(skipPtrs) if concreteBase.kind == tyObject and tfFinal notin concreteBase.flags: addInheritedFields(c, check, pos, concreteBase) else: diff --git a/tests/compile/tinheritref.nim b/tests/compile/tinheritref.nim new file mode 100644 index 000000000..e5de6a4be --- /dev/null +++ b/tests/compile/tinheritref.nim @@ -0,0 +1,27 @@ +discard """ + output: "23" +""" + +# bug #554, #179 + +type T[E] = + ref object + elem: E + +var ob: T[int] + +ob = T[int](elem: 23) +echo ob.elem + +type + TTreeIteratorA* = ref object {.inheritable.} + + TKeysIteratorA* = ref object of TTreeIteratorA #compiles + + TTreeIterator* [T,D] = ref object {.inheritable.} + + TKeysIterator* [T,D] = ref object of TTreeIterator[T,D] #this not + +var + it: TKeysIterator[int, string] = nil + |