fixes #3431, fixes #3370, fixes #3468

This commit is contained in:
Araq
2015-10-25 02:22:50 +01:00
parent 77dc0e50ff
commit aa36e73ecf
2 changed files with 52 additions and 3 deletions

View File

@@ -66,15 +66,16 @@ proc sameMethodBucket(a, b: PSym): MethodResult =
bb = bb.lastSon
else:
break
if sameType(aa, bb): discard
if sameType(aa, bb):
if aa.kind == tyObject and result != Invalid: result = Yes
elif aa.kind == tyObject and bb.kind == tyObject:
let diff = inheritanceDiff(bb, aa)
if diff < 0: discard "Ok"
if diff < 0:
if result != Invalid: result = Yes
elif diff != high(int):
result = Invalid
else:
return No
if result != Invalid: result = Yes
proc attachDispatcher(s: PSym, dispatcher: PNode) =
var L = s.ast.len-1

48
tests/method/tmultim7.nim Normal file
View File

@@ -0,0 +1,48 @@
# bug #3431
type
Lexer = object
buf*: string
pos*: int
lastchar*: char
ASTNode = object
method init*(self: var Lexer; buf: string) {.base.} =
self.buf = buf
self.pos = 0
self.lastchar = self.buf[0]
method init*(self: var ASTNode; val: string) =
discard
# bug #3370
type
RefTestA*[T] = ref object of RootObj
data*: T
method tester*[S](self: S): bool =
true
type
RefTestB* = RefTestA[(string, int)]
method tester*(self: RefTestB): bool =
true
type
RefTestC = RefTestA[string]
method tester*(self: RefTestC): bool =
false
# bug #3468
type X = ref object of RootObj
type Y = ref object of RootObj
method draw*(x: X) {.base.} = discard
method draw*(y: Y) {.base.} = discard