summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorLemonBoy <thatlemon@gmail.com>2018-06-22 15:09:35 +0200
committerLemonBoy <thatlemon@gmail.com>2018-06-22 19:47:44 +0200
commite39baf46fc523245a7d73b263808b944c6f225db (patch)
tree6b8ec4757b539f28fe2ca9473c7bfa51242661a6
parentaf66258dca695d932e76ea31bdee2b2f185139cb (diff)
downloadNim-e39baf46fc523245a7d73b263808b944c6f225db.tar.gz
Don't blow up with recursive objects
-rw-r--r--compiler/sighashes.nim7
-rw-r--r--tests/types/t7905.nim15
2 files changed, 18 insertions, 4 deletions
diff --git a/compiler/sighashes.nim b/compiler/sighashes.nim
index 720d1848d..0bf2b8459 100644
--- a/compiler/sighashes.nim
+++ b/compiler/sighashes.nim
@@ -193,16 +193,15 @@ proc hashType(c: var MD5Context, t: PType; flags: set[ConsiderFlag]) =
         # generated object names can be identical, so we need to
         # disambiguate furthermore by hashing the field types and names:
         # mild hack to prevent endless recursions (makes nimforum compile again):
-        let wasAnon = sfAnon in t.sym.flags
-        excl t.sym.flags, sfAnon
+        let oldFlags = t.sym.flags
+        t.sym.flags = t.sym.flags - {sfAnon, sfGenSym}
         let n = t.n
         for i in 0 ..< n.len:
           assert n[i].kind == nkSym
           let s = n[i].sym
           c.hashSym s
           c.hashType s.typ, flags
-        if wasAnon:
-          incl t.sym.flags, sfAnon
+        t.sym.flags = oldFlags
     else:
       c &= t.id
     if t.len > 0 and t.sons[0] != nil:
diff --git a/tests/types/t7905.nim b/tests/types/t7905.nim
index ddb371039..ef75bb86c 100644
--- a/tests/types/t7905.nim
+++ b/tests/types/t7905.nim
@@ -2,6 +2,8 @@ discard """
   output: '''
 (member: "hello world")
 (member: 123.456)
+(member: "hello world", x: ...)
+(member: 123.456, x: ...)
 '''
 """
 
@@ -16,3 +18,16 @@ template foobar(arg: typed): untyped =
 
 foobar("hello world")
 foobar(123.456'f64)
+
+template foobarRec(arg: typed): untyped =
+  type
+    MyType = object
+      member: type(arg)
+      x: ref MyType
+
+  var myVar: MyType
+  myVar.member = arg
+  echo myVar
+
+foobarRec("hello world")
+foobarRec(123.456'f64)