summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/semstmts.nim2
-rw-r--r--compiler/sighashes.nim19
-rw-r--r--tests/errmsgs/tsigmatch.nim6
-rw-r--r--tests/errmsgs/tsigmatch2.nim4
-rw-r--r--tests/types/tissues_types.nim30
5 files changed, 46 insertions, 15 deletions
diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim
index 4d4f70245..b91e93025 100644
--- a/compiler/semstmts.nim
+++ b/compiler/semstmts.nim
@@ -1298,6 +1298,8 @@ proc typeSectionFinalPass(c: PContext, n: PNode) =
         checkConstructedType(c.config, s.info, s.typ)
         if s.typ.kind in {tyObject, tyTuple} and not s.typ.n.isNil:
           checkForMetaFields(c, s.typ.n)
+          # fix bug #5170: ensure locally scoped object types get a unique name:
+          if s.typ.kind == tyObject and not isTopLevel(c): incl(s.flags, sfGenSym)
   #instAllTypeBoundOp(c, n.info)
 
 
diff --git a/compiler/sighashes.nim b/compiler/sighashes.nim
index f94cd5bce..0902a839b 100644
--- a/compiler/sighashes.nim
+++ b/compiler/sighashes.nim
@@ -35,6 +35,7 @@ type
     CoIgnoreRange
     CoConsiderOwned
     CoDistinct
+    CoHashTypeInsideNode
 
 proc hashType(c: var MD5Context, t: PType; flags: set[ConsiderFlag])
 
@@ -61,7 +62,7 @@ proc hashTypeSym(c: var MD5Context, s: PSym) =
       c &= "."
       it = it.owner
 
-proc hashTree(c: var MD5Context, n: PNode) =
+proc hashTree(c: var MD5Context, n: PNode; flags: set[ConsiderFlag]) =
   if n == nil:
     c &= "\255"
     return
@@ -75,6 +76,8 @@ proc hashTree(c: var MD5Context, n: PNode) =
     c &= n.ident.s
   of nkSym:
     hashSym(c, n.sym)
+    if CoHashTypeInsideNode in flags and n.sym.typ != nil:
+      hashType(c, n.sym.typ, flags)
   of nkCharLit..nkUInt64Lit:
     let v = n.intVal
     lowlevel v
@@ -84,7 +87,7 @@ proc hashTree(c: var MD5Context, n: PNode) =
   of nkStrLit..nkTripleStrLit:
     c &= n.strVal
   else:
-    for i in 0..<n.len: hashTree(c, n[i])
+    for i in 0..<n.len: hashTree(c, n[i], flags)
 
 proc hashType(c: var MD5Context, t: PType; flags: set[ConsiderFlag]) =
   if t == nil:
@@ -155,11 +158,7 @@ proc hashType(c: var MD5Context, t: PType; flags: set[ConsiderFlag]) =
           let oldFlags = t.sym.flags
           # Mild hack to prevent endless recursion.
           t.sym.flags = t.sym.flags - {sfAnon, sfGenSym}
-          for n in t.n:
-            assert(n.kind == nkSym)
-            let s = n.sym
-            c.hashSym s
-            c.hashType s.typ, flags
+          hashTree(c, t.n, flags + {CoHashTypeInsideNode})
           t.sym.flags = oldFlags
         else:
           # The object has no fields: we _must_ add something here in order to
@@ -176,7 +175,7 @@ proc hashType(c: var MD5Context, t: PType; flags: set[ConsiderFlag]) =
     if tfVarIsPtr in t.flags: c &= ".varisptr"
   of tyFromExpr:
     c &= char(t.kind)
-    c.hashTree(t.n)
+    c.hashTree(t.n, {})
   of tyTuple:
     c &= char(t.kind)
     if t.n != nil and CoType notin flags:
@@ -192,11 +191,11 @@ proc hashType(c: var MD5Context, t: PType; flags: set[ConsiderFlag]) =
   of tyRange:
     if CoIgnoreRange notin flags:
       c &= char(t.kind)
-      c.hashTree(t.n)
+      c.hashTree(t.n, {})
     c.hashType(t[0], flags)
   of tyStatic:
     c &= char(t.kind)
-    c.hashTree(t.n)
+    c.hashTree(t.n, {})
     c.hashType(t[0], flags)
   of tyProc:
     c &= char(t.kind)
diff --git a/tests/errmsgs/tsigmatch.nim b/tests/errmsgs/tsigmatch.nim
index 21e2c217d..6b85d1408 100644
--- a/tests/errmsgs/tsigmatch.nim
+++ b/tests/errmsgs/tsigmatch.nim
@@ -98,13 +98,13 @@ expression: fun1(default(Mystring), "asdf")
 
 
 ## line 100
-block:
+when true:
   # bug #11061 Type mismatch error "first type mismatch at" points to wrong argument/position
   # Note: the error msg now gives correct position for mismatched argument
   type
     A = object of RootObj
     B = object of A
-
+block:
   proc f(b: B) = discard
   proc f(a: A) = discard
 
@@ -163,7 +163,7 @@ block:
   var foo = ""
   f(foo, a0 = 12)
 
-block:
+when true:
   type Mystring = string
   type MyInt = int
   proc fun1(a1: MyInt, a2: Mystring) = discard
diff --git a/tests/errmsgs/tsigmatch2.nim b/tests/errmsgs/tsigmatch2.nim
index c4eb4c197..4e95d3e1b 100644
--- a/tests/errmsgs/tsigmatch2.nim
+++ b/tests/errmsgs/tsigmatch2.nim
@@ -28,11 +28,11 @@ expression: foo 1
 
 
 # line 30
-
+type Foo = object
 block: # issue #13182
   proc myproc(a: int): string = $("myproc", a)
   proc foo(args: varargs[string, myproc]): string = $args
-  type Foo = object
+
   proc foo(i: Foo): string = "in foo(i)"
   static: doAssert foo(Foo()) == "in foo(i)"
   static: doAssert foo(1) == """["(\"myproc\", 1)"]"""
diff --git a/tests/types/tissues_types.nim b/tests/types/tissues_types.nim
index e5039fa61..7ed0547bf 100644
--- a/tests/types/tissues_types.nim
+++ b/tests/types/tissues_types.nim
@@ -8,6 +8,8 @@ ptr Foo
 (member: 123.456)
 (member: "hello world", x: ...)
 (member: 123.456, x: ...)
+0
+false
 '''
 joinable: false
 """
@@ -78,3 +80,31 @@ block t7905:
 
   foobarRec("hello world")
   foobarRec(123.456'f64)
+
+# bug #5170
+
+when true:
+  type Foo = object
+    bar: bool
+
+  type Bar = object
+    sameBody: string
+
+  var b0: Bar
+  b0.sameBody = "abc"
+
+block:
+  type Foo = object
+    baz: int
+
+  type Bar = object
+    sameBody: string
+
+  var b1: Bar
+  b1.sameBody = "def"
+
+  var f2: Foo
+  echo f2.baz
+
+var f1: Foo
+echo f1.bar