block: # bug #15526
  block:
    type Foo = ref object
      x1: int
    let f1 = Foo(x1: 1)
  block:
    type Foo = ref object
      x2: int
    let f2 = Foo(x2: 2)

block: # ditto
  template fn() =
    block:
      type Foo = ref object
        x1: int
      let f1 = Foo(x1: 1)
      doAssert f1.x1 == 1
    block:
      type Foo = ref object
        x2: int
      let f2 = Foo(x2: 2)
      doAssert f2.x2 == 2
  static: fn()
  fn()

block: # bug #17162
  template fn =
    var ret: string
    block:
      type A = enum a0, a1, a2
      for ai in A:
        ret.add $ai
    block:
      type A = enum b0, b1, b2, b3
      for ai in A:
        ret.add $ai
    doAssert ret == "a0a1a2b0b1b2b3"

  static: fn() # ok
  fn() # was bug

block: # ditto
  proc fn =
    var ret: string
    block:
      type A = enum a0, a1, a2
      for ai in A:
        ret.add $ai
    block:
      type A = enum b0, b1, b2, b3
      for ai in A:
        ret.add $ai
    doAssert ret == "a0a1a2b0b1b2b3"

  static: fn() # ok
  fn() # was bug

block: # bug #5170
  block:
    type Foo = object
      x1: int
    let f1 = Foo(x1: 1)
  block:
    type Foo = object
      x2: int
    let f2 = Foo(x2: 2)

block: # ditto
  block:
    type Foo = object
      bar: bool
    var f1: Foo

  block:
    type Foo = object
      baz: int
    var f2: Foo
    doAssert f2.baz == 0

  block:
    template fn() =
      block:
        type Foo = object
          x1: int
        let f1 = Foo(x1: 1)
        doAssert f1.x1 == 1
      block:
        type Foo = object
          x2: int
        let f2 = Foo(x2: 2)
        doAssert f2.x2 == 2
    static: fn()
    fn()

when true: # ditto, refs https://github.com/nim-lang/Nim/issues/5170#issuecomment-582712132
  type Foo1 = object # at top level
    bar: bool
  var f1: Foo1

  block:
    type Foo1 = object
      baz: int
    var f2: Foo1
    doAssert f2.baz == 0

block: # make sure `hashType` doesn't recurse infinitely
  type
    PFoo = ref object
      a, b: PFoo
      c: int
  var a: PFoo
