* fixes #5170

* make tests green
This commit is contained in:
Andreas Rumpf 2020-03-05 16:02:34 +01:00 • committed by GitHub
commit 83e715c5b6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 46 additions and 15 deletions

View file

@ -1298,6 +1298,8 @@ proc typeSectionFinalPass(c: PContext, n: PNode) =
checkConstructedType(c.config, s.info, s.typ) checkConstructedType(c.config, s.info, s.typ)
if s.typ.kind in {tyObject, tyTuple} and not s.typ.n.isNil: if s.typ.kind in {tyObject, tyTuple} and not s.typ.n.isNil:
checkForMetaFields(c, s.typ.n) 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) #instAllTypeBoundOp(c, n.info)

View file

@ -35,6 +35,7 @@ type
CoIgnoreRange CoIgnoreRange
CoConsiderOwned CoConsiderOwned
CoDistinct CoDistinct
CoHashTypeInsideNode
proc hashType(c: var MD5Context, t: PType; flags: set[ConsiderFlag]) proc hashType(c: var MD5Context, t: PType; flags: set[ConsiderFlag])
@ -61,7 +62,7 @@ proc hashTypeSym(c: var MD5Context, s: PSym) =
c &= "." c &= "."
it = it.owner it = it.owner
proc hashTree(c: var MD5Context, n: PNode) = proc hashTree(c: var MD5Context, n: PNode; flags: set[ConsiderFlag]) =
if n == nil: if n == nil:
c &= "\255" c &= "\255"
return return
@ -75,6 +76,8 @@ proc hashTree(c: var MD5Context, n: PNode) =
c &= n.ident.s c &= n.ident.s
of nkSym: of nkSym:
hashSym(c, n.sym) hashSym(c, n.sym)
if CoHashTypeInsideNode in flags and n.sym.typ != nil:
hashType(c, n.sym.typ, flags)
of nkCharLit..nkUInt64Lit: of nkCharLit..nkUInt64Lit:
let v = n.intVal let v = n.intVal
lowlevel v lowlevel v
@ -84,7 +87,7 @@ proc hashTree(c: var MD5Context, n: PNode) =
of nkStrLit..nkTripleStrLit: of nkStrLit..nkTripleStrLit:
c &= n.strVal c &= n.strVal
else: 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]) = proc hashType(c: var MD5Context, t: PType; flags: set[ConsiderFlag]) =
if t == nil: if t == nil:
@ -155,11 +158,7 @@ proc hashType(c: var MD5Context, t: PType; flags: set[ConsiderFlag]) =
let oldFlags = t.sym.flags let oldFlags = t.sym.flags
# Mild hack to prevent endless recursion. # Mild hack to prevent endless recursion.
t.sym.flags = t.sym.flags - {sfAnon, sfGenSym} t.sym.flags = t.sym.flags - {sfAnon, sfGenSym}
for n in t.n: hashTree(c, t.n, flags + {CoHashTypeInsideNode})
assert(n.kind == nkSym)
let s = n.sym
c.hashSym s
c.hashType s.typ, flags
t.sym.flags = oldFlags t.sym.flags = oldFlags
else: else:
# The object has no fields: we _must_ add something here in order to # 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" if tfVarIsPtr in t.flags: c &= ".varisptr"
of tyFromExpr: of tyFromExpr:
c &= char(t.kind) c &= char(t.kind)
c.hashTree(t.n) c.hashTree(t.n, {})
of tyTuple: of tyTuple:
c &= char(t.kind) c &= char(t.kind)
if t.n != nil and CoType notin flags: if t.n != nil and CoType notin flags:
@ -192,11 +191,11 @@ proc hashType(c: var MD5Context, t: PType; flags: set[ConsiderFlag]) =
of tyRange: of tyRange:
if CoIgnoreRange notin flags: if CoIgnoreRange notin flags:
c &= char(t.kind) c &= char(t.kind)
c.hashTree(t.n) c.hashTree(t.n, {})
c.hashType(t[0], flags) c.hashType(t[0], flags)
of tyStatic: of tyStatic:
c &= char(t.kind) c &= char(t.kind)
c.hashTree(t.n) c.hashTree(t.n, {})
c.hashType(t[0], flags) c.hashType(t[0], flags)
of tyProc: of tyProc:
c &= char(t.kind) c &= char(t.kind)

View file

@ -98,13 +98,13 @@ expression: fun1(default(Mystring), "asdf")
## line 100 ## line 100
block: when true:
# bug #11061 Type mismatch error "first type mismatch at" points to wrong argument/position # 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 # Note: the error msg now gives correct position for mismatched argument
type type
A = object of RootObj A = object of RootObj
B = object of A B = object of A
block:
proc f(b: B) = discard proc f(b: B) = discard
proc f(a: A) = discard proc f(a: A) = discard
@ -163,7 +163,7 @@ block:
var foo = "" var foo = ""
f(foo, a0 = 12) f(foo, a0 = 12)
block: when true:
type Mystring = string type Mystring = string
type MyInt = int type MyInt = int
proc fun1(a1: MyInt, a2: Mystring) = discard proc fun1(a1: MyInt, a2: Mystring) = discard

View file

@ -28,11 +28,11 @@ expression: foo 1
# line 30 # line 30
type Foo = object
block: # issue #13182 block: # issue #13182
proc myproc(a: int): string = $("myproc", a) proc myproc(a: int): string = $("myproc", a)
proc foo(args: varargs[string, myproc]): string = $args proc foo(args: varargs[string, myproc]): string = $args
type Foo = object
proc foo(i: Foo): string = "in foo(i)" proc foo(i: Foo): string = "in foo(i)"
static: doAssert foo(Foo()) == "in foo(i)" static: doAssert foo(Foo()) == "in foo(i)"
static: doAssert foo(1) == """["(\"myproc\", 1)"]""" static: doAssert foo(1) == """["(\"myproc\", 1)"]"""

View file

@ -8,6 +8,8 @@ ptr Foo
(member: 123.456) (member: 123.456)
(member: "hello world", x: ...) (member: "hello world", x: ...)
(member: 123.456, x: ...) (member: 123.456, x: ...)
0
false
''' '''
joinable: false joinable: false
""" """
@ -78,3 +80,31 @@ block t7905:
foobarRec("hello world") foobarRec("hello world")
foobarRec(123.456'f64) 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