diff options
author | LemonBoy <thatlemon@gmail.com> | 2018-06-21 22:21:24 +0200 |
---|---|---|
committer | LemonBoy <thatlemon@gmail.com> | 2018-06-22 13:09:33 +0200 |
commit | af66258dca695d932e76ea31bdee2b2f185139cb (patch) | |
tree | dcefe96abe0cde0c24913474be47fb6ad7170d60 | |
parent | 0da87939d136f90eeb0ec613ff484b8f2992e7b0 (diff) | |
download | Nim-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.nim | 6 | ||||
-rw-r--r-- | tests/types/t7905.nim | 18 |
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) |