diff options
author | Arne Döring <arne.doering@gmx.net> | 2019-04-04 09:06:12 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2019-04-04 09:06:12 +0200 |
commit | 65ee80e50ca6b693eab6216383405797c748b72f (patch) | |
tree | ecf46bd2149afd24416e50e4f4124a707eb64b76 | |
parent | e5cdd7f773d0d32f09676fb81f053ad76a76ec1d (diff) | |
download | Nim-65ee80e50ca6b693eab6216383405797c748b72f.tar.gz |
Pure ref object; fixes #10721 (#10955)
-rw-r--r-- | compiler/semstmts.nim | 2 | ||||
-rw-r--r-- | tests/types/tinheritref.nim | 49 |
2 files changed, 43 insertions, 8 deletions
diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index bc403f1ea..a3df95190 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -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 diff --git a/tests/types/tinheritref.nim b/tests/types/tinheritref.nim index 00af0538d..01f2307c0 100644 --- a/tests/types/tinheritref.nim +++ b/tests/types/tinheritref.nim @@ -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() |