Skip to content

Commit b4901a5

Browse files
forkiKevinRansom
authored andcommitted
Improve error reporting: override method does not match abstract member - references #1430 (#1950)
1 parent 3925d98 commit b4901a5

File tree

4 files changed

+33
-4
lines changed

4 files changed

+33
-4
lines changed

src/fsharp/FSComp.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -680,7 +680,7 @@ tcUnnamedArgumentsDoNotFormPrefix,"The unnamed arguments do not form a prefix of
680680
853,tcAbstractMembersIllegalInAugmentation,"Abstract members are not permitted in an augmentation - they must be defined as part of the type itself"
681681
854,tcMethodOverridesIllegalHere,"Method overrides and interface implementations are not permitted here"
682682
855,tcNoMemberFoundForOverride,"No abstract or interface member was found that corresponds to this override"
683-
856,tcOverrideArityMismatch,"This override takes a different number of arguments to the corresponding abstract member"
683+
856,tcOverrideArityMismatch,"This override takes a different number of arguments to the corresponding abstract member. The following abstract members were found:%s"
684684
857,tcDefaultImplementationAlreadyExists,"This method already has a default implementation"
685685
858,tcDefaultAmbiguous,"The method implemented by this default is ambiguous"
686686
859,tcNoPropertyFoundForOverride,"No abstract property was found that corresponds to this override"

src/fsharp/TypeChecker.fs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10597,7 +10597,7 @@ and ComputeIsComplete enclosingDeclaredTypars declaredTypars ty =
1059710597
/// Determine if a uniquely-identified-abstract-slot exists for an override member (or interface member implementation) based on the information available
1059810598
/// at the syntactic definition of the member (i.e. prior to type inference). If so, we know the expected signature of the override, and the full slotsig
1059910599
/// it implements. Apply the inferred slotsig.
10600-
and ApplyAbstractSlotInference cenv (envinner:TcEnv) (bindingTy,m,synTyparDecls,declaredTypars,memberId,tcrefObjTy,renaming,_objTy,optIntfSlotTy,valSynData,memberFlags,attribs) =
10600+
and ApplyAbstractSlotInference (cenv:cenv) (envinner:TcEnv) (bindingTy,m,synTyparDecls,declaredTypars,memberId,tcrefObjTy,renaming,_objTy,optIntfSlotTy,valSynData,memberFlags,attribs) =
1060110601

1060210602
let ad = envinner.eAccessRights
1060310603
let typToSearchForAbstractMembers =
@@ -10627,11 +10627,17 @@ and ApplyAbstractSlotInference cenv (envinner:TcEnv) (bindingTy,m,synTyparDecls,
1062710627
errorR(Error(FSComp.SR.tcNoMemberFoundForOverride(),memberId.idRange))
1062810628
[]
1062910629

10630-
| _ ->
10630+
| slots ->
1063110631
match dispatchSlotsArityMatch with
1063210632
| meths when meths |> makeUniqueBySig |> List.length = 1 -> meths
1063310633
| [] ->
10634-
errorR(Error(FSComp.SR.tcOverrideArityMismatch(),memberId.idRange))
10634+
let details =
10635+
slots
10636+
|> List.map (NicePrint.stringOfMethInfo cenv.amap m envinner.DisplayEnv)
10637+
|> Seq.map (sprintf "%s %s" System.Environment.NewLine)
10638+
|> String.concat ""
10639+
10640+
errorR(Error(FSComp.SR.tcOverrideArityMismatch(details),memberId.idRange))
1063510641
[]
1063610642
| _ -> [] // check that method to override is sealed is located at CheckOverridesAreAllUsedOnce (typrelns.fs)
1063710643
// We hit this case when it is ambiguous which abstract method is being implemented.
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// #Warnings
2+
//<Expects status="Error" span="(12,16)" id="FS0856">This override takes a different number of arguments to the corresponding abstract member. The following abstract members were found:</Expects>
3+
//<Expects>abstract member Base.Member : int * string -> string</Expects>
4+
//<Expects status="Error" span="(20,24)" id="FS0001">This expression was expected to have type</Expects>
5+
6+
type Base() =
7+
abstract member Member: int * string -> string
8+
default x.Member (i, s) = s
9+
10+
type Derived1() =
11+
inherit Base()
12+
override x.Member() = 5
13+
14+
type Derived2() =
15+
inherit Base()
16+
override x.Member (i : int) = "Hello"
17+
18+
type Derived3() =
19+
inherit Base()
20+
override x.Member (s : string, i : int) = sprintf "Hello %s" s
21+
22+
exit 0

tests/fsharpqa/Source/Warnings/env.lst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
SOURCE=ValidCommaInRecCtor.fs # ValidCommaInRecCtor.fs
1010
SOURCE=FS0988AtEndOfFile.fs # FS0988AtEndOfFile.fs
1111
SOURCE=WrongArity.fs # WrongArity.fs
12+
SOURCE=OverrideErrors.fs # OverrideErrors.fs
1213
SOURCE=AccessOfTypeAbbreviation.fs # AccessOfTypeAbbreviation.fs
1314
SOURCE=AccessOfTypeAbbreviation2.fs # AccessOfTypeAbbreviation2.fs
1415
SOURCE=AccessOfTypeAbbreviation3.fs # AccessOfTypeAbbreviation3.fs

0 commit comments

Comments
 (0)