summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorArne Döring <arne.doering@gmx.net>2019-04-04 09:06:12 +0200
committerAndreas Rumpf <rumpf_a@web.de>2019-04-04 09:06:12 +0200
commit65ee80e50ca6b693eab6216383405797c748b72f (patch)
treeecf46bd2149afd24416e50e4f4124a707eb64b76
parente5cdd7f773d0d32f09676fb81f053ad76a76ec1d (diff)
downloadNim-65ee80e50ca6b693eab6216383405797c748b72f.tar.gz
Pure ref object; fixes #10721 (#10955)
-rw-r--r--compiler/semstmts.nim2
-rw-r--r--tests/types/tinheritref.nim49
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()