diff options
-rw-r--r-- | compiler/cgmeth.nim | 3 | ||||
-rw-r--r-- | compiler/types.nim | 2 | ||||
-rw-r--r-- | tests/method/t22673.nim | 21 |
3 files changed, 24 insertions, 2 deletions
diff --git a/compiler/cgmeth.nim b/compiler/cgmeth.nim index 8ad6bf3f4..5821988bb 100644 --- a/compiler/cgmeth.nim +++ b/compiler/cgmeth.nim @@ -101,7 +101,8 @@ proc sameMethodBucket(a, b: PSym; multiMethods: bool): MethodResult = return No if result == Yes: # check for return type: - if not sameTypeOrNil(a.typ[0], b.typ[0]): + # ignore flags of return types; # bug #22673 + if not sameTypeOrNil(a.typ[0], b.typ[0], {IgnoreFlags}): if b.typ[0] != nil and b.typ[0].kind == tyUntyped: # infer 'auto' from the base to make it consistent: b.typ[0] = a.typ[0] diff --git a/compiler/types.nim b/compiler/types.nim index 46433a230..4bc78cbb8 100644 --- a/compiler/types.nim +++ b/compiler/types.nim @@ -972,7 +972,7 @@ type ExactGcSafety AllowCommonBase PickyCAliases # be picky about the distinction between 'cint' and 'int32' - IgnoreFlags # used for borrowed functions; ignores the tfVarIsPtr flag + IgnoreFlags # used for borrowed functions and methods; ignores the tfVarIsPtr flag TTypeCmpFlags* = set[TTypeCmpFlag] diff --git a/tests/method/t22673.nim b/tests/method/t22673.nim new file mode 100644 index 000000000..1689e9d42 --- /dev/null +++ b/tests/method/t22673.nim @@ -0,0 +1,21 @@ +discard """ + matrix: "--warningAsError:UseBase" +""" + +# bug #22673 +type RefEntry = ref object of RootObj + +type RefFile = ref object of RefEntry + filename*: string + data*: string + +type RefDir = ref object of RefEntry + dirname*: string + files*: seq[RefFile] + +method name*(e: RefEntry): lent string {.base.} = + raiseAssert "Don't call the base method" + +method name*(e: RefFile): lent string = e.filename + +method name*(e: RefDir): lent string = e.dirname \ No newline at end of file |