parent
62c113ebc7
commit
83e715c5b6
5 changed files with 46 additions and 15 deletions
|
|
@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)"]"""
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue