type with same name in different scope now works (#17710)

* type with same name in different scope now works
* fix tests/enum/tenum.nim which was wrong because it was affected by this bug
This commit is contained in:
Timothee Cour 2021-04-13 23:50:15 -07:00 • committed by GitHub
commit 840e13deb7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 133 additions and 9 deletions

View file

@ -0,0 +1,111 @@
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