summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorLemonBoy <thatlemon@gmail.com>2018-06-21 22:21:24 +0200
committerLemonBoy <thatlemon@gmail.com>2018-06-22 13:09:33 +0200
commitaf66258dca695d932e76ea31bdee2b2f185139cb (patch)
treedcefe96abe0cde0c24913474be47fb6ad7170d60
parent0da87939d136f90eeb0ec613ff484b8f2992e7b0 (diff)
downloadNim-af66258dca695d932e76ea31bdee2b2f185139cb.tar.gz
Discriminate gensym'd type names in sigHash
The root cause of #7905 lies in the codegen phase. The two template
instantiations generate two different MyType types with different
members but same t.sym.name leading the caching mechanism to confuse
the two.

Fixes #7905
-rw-r--r--compiler/sighashes.nim6
-rw-r--r--tests/types/t7905.nim18
2 files changed, 22 insertions, 2 deletions
diff --git a/compiler/sighashes.nim b/compiler/sighashes.nim
index 0b95387cd..720d1848d 100644
--- a/compiler/sighashes.nim
+++ b/compiler/sighashes.nim
@@ -189,10 +189,11 @@ proc hashType(c: var MD5Context, t: PType; flags: set[ConsiderFlag]) =
         c.hashTypeSym(t.sym)
       else:
         c.hashSym(t.sym)
-      if sfAnon in t.sym.flags:
+      if {sfAnon, sfGenSym} * t.sym.flags != {}:
         # 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 n = t.n
         for i in 0 ..< n.len:
@@ -200,7 +201,8 @@ proc hashType(c: var MD5Context, t: PType; flags: set[ConsiderFlag]) =
           let s = n[i].sym
           c.hashSym s
           c.hashType s.typ, flags
-        incl t.sym.flags, sfAnon
+        if wasAnon:
+          incl t.sym.flags, sfAnon
     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
new file mode 100644
index 000000000..ddb371039
--- /dev/null
+++ b/tests/types/t7905.nim
@@ -0,0 +1,18 @@
+discard """
+  output: '''
+(member: "hello world")
+(member: 123.456)
+'''
+"""
+
+template foobar(arg: typed): untyped =
+  type
+    MyType = object
+      member: type(arg)
+
+  var myVar: MyType
+  myVar.member = arg
+  echo myVar
+
+foobar("hello world")
+foobar(123.456'f64)