Pure ref object; fixes #10721 (#10955)

This commit is contained in:
Arne Döring
2019-04-04 09:06:12 +02:00
committed by Andreas Rumpf
parent e5cdd7f773
commit 65ee80e50c
2 changed files with 43 additions and 8 deletions

View File

@@ -1203,6 +1203,8 @@ proc typeSectionRightSidePass(c: PContext, n: PNode) =
incl st.flags, tfRefsAnonObj
let obj = newSym(skType, getIdent(c.cache, s.name.s & ":ObjectType"),
getCurrOwner(c), s.info)
if sfPure in s.flags:
obj.flags.incl sfPure
obj.typ = st.lastSon
st.lastSon.sym = obj

View File

@@ -1,9 +1,3 @@
discard """
output: '''23
1.5
'''
"""
# bug #554, #179
type T[E] =
@@ -13,7 +7,8 @@ type T[E] =
var ob: T[int]
ob = T[int](elem: 23)
echo ob.elem
doAssert ob.elem == 23
type
TTreeIteratorA* = ref object {.inheritable.}
@@ -47,4 +42,42 @@ type
var x = Apple(kind: Smooth, skin: 1.5)
var u = x.skin
echo u
doAssert u == 1.5
type
BaseRef {.inheritable, pure.} = ref object
baseRef: int
SubRef = ref object of BaseRef
BasePtr {.inheritable, pure.} = ptr object
basePtr: int
SubPtr = ptr object of BasePtr
BaseObj {.inheritable, pure.} = object
baseObj: int
SubObj = object of BaseObj
template baseObj[T](t: ptr T): untyped = T
proc something123(): int =
var r : SubRef
r.new
var p : SubPtr
p = create(baseObj(p))
var r2 : ref BaseObj
r2.new
var accu = 0
# trigger code generation
accu += r.baseRef
accu += p.basePtr
accu += r2.baseObj
doAssert sizeof(r[]) == sizeof(int)
doAssert sizeof(baseObj(p)) == sizeof(int)
doAssert sizeof(r2[]) == sizeof(int)
discard something123()