Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit8d85332

Browse files
committed
Fix 34 - extension member duplicate check (2)
1 parent1251430 commit8d85332

File tree

3 files changed

+37
-3
lines changed

3 files changed

+37
-3
lines changed

‎src/fsharp/check.fs‎

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1070,14 +1070,16 @@ let CheckTopBinding cenv env (TBind(v,e,_) as bind) =
10701070
|_->true(* not hiddenRepr*)
10711071

10721072
letkind=(if v.IsMemberthen"member"else"value")
1073+
10731074
letcheck skipValCheck nm=
10741075
ifnot skipValCheck&&
1075-
v.IsModuleBinding&&
1076+
v.IsModuleBinding&&
10761077
tcref.ModuleOrNamespaceType.AllValsByLogicalName.ContainsKey(nm)&&
10771078
not(valEq tcref.ModuleOrNamespaceType.AllValsByLogicalName.[nm] v)then
10781079

10791080
error(Duplicate(kind,v.DisplayName,v.Range));
10801081

1082+
10811083
#if CASES_IN_NESTED_CLASS
10821084
if tcref.IsUnionTycon&& nm="Cases"then
10831085
errorR(NameClash(nm,kind,v.DisplayName,v.Range,"generated type","Cases",tcref.Range));
@@ -1125,6 +1127,18 @@ let CheckTopBinding cenv env (TBind(v,e,_) as bind) =
11251127
checkfalse v.DisplayName
11261128
checkfalse v.CompiledName
11271129

1130+
// Check if an F# extension member clashes
1131+
if v.IsExtensionMemberthen
1132+
tcref.ModuleOrNamespaceType.AllValsAndMembersByLogicalNameUncached.[v.LogicalName]|> List.iter(fun v2->
1133+
if v2.IsExtensionMember&&not(valEq v v2)&& v.CompiledName= v2.CompiledNamethen
1134+
letminfo1= FSMeth(cenv.g, generalizedTyconRef tcref, mkLocalValRef v, Some0UL)
1135+
letminfo2= FSMeth(cenv.g, generalizedTyconRef tcref, mkLocalValRef v2, Some0UL)
1136+
if tyconRefEq cenv.g v.MemberApparentParent v2.MemberApparentParent&&
1137+
MethInfosEquivByNameAndSig EraseAlltrue cenv.g cenv.amap v.Range minfo1 minfo2then
1138+
errorR(Duplicate(kind,v.DisplayName,v.Range)))
1139+
1140+
1141+
11281142
// Properties get 'get_X', only if there are no args
11291143
// Properties get 'get_X'
11301144
match v.ValReprInfowith
@@ -1191,9 +1205,9 @@ let CheckEntityDefn cenv env (tycon:Entity) =
11911205

11921206
letimmediateProps= GetImmediateIntrinsicPropInfosOfType(None,AccessibleFromSomewhere) cenv.g cenv.amap m typ
11931207

1194-
letgetHash(hash:Dictionary<string,_>)nm=
1208+
letgetHash(hash:Dictionary<string,_>)nm=
11951209
if hash.ContainsKey(nm)then hash.[nm]else[]
1196-
1210+
11971211
// precompute methods grouped by MethInfo.LogicalName
11981212
lethashOfImmediateMeths=
11991213
leth=new Dictionary<string,_>()

‎tests/fsharp/typecheck/sigs/neg23.bsl‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,11 @@ neg23.fs(92,18,92,21): typecheck error FS0439: The method 'X04' has curried argu
3838
neg23.fs(110,21,110,22): typecheck error FS0439: The method 'F' has curried arguments but has the same name as another methodin this type. Methods with curried arguments cannot be overloaded. Consider using a method taking tupled arguments.
3939

4040
neg23.fs(113,21,113,22): typecheck error FS0439: The method 'F' has curried arguments but has the same name as another methodin this type. Methods with curried arguments cannot be overloaded. Consider using a method taking tupled arguments.
41+
42+
neg23.fs(164,18,164,29): typecheck error FS0037: Two members called 'GroupRowsBy' have the same signature
43+
44+
neg23.fs(165,18,165,29): typecheck error FS0037: Two members called 'GroupRowsBy' have the same signature
45+
46+
neg23.fs(168,17,168,20): typecheck error FS0037: Two members called 'Foo' have the same signature
47+
48+
neg23.fs(169,17,169,20): typecheck error FS0037: Two members called 'Foo' have the same signature

‎tests/fsharp/typecheck/sigs/neg23.fs‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,3 +155,15 @@ module PositiveTests =
155155
lety2:int->int= c.M2(3,4)
156156
lety3:int* int-> int-> int= c.M2
157157

158+
159+
typeFrame=
160+
class
161+
end
162+
moduleX=
163+
typeFramewith
164+
memberframe.GroupRowsBy(key)=()
165+
memberframe.GroupRowsBy(key)=()
166+
167+
// Up to erasure
168+
memberthis.Foo(x:int->int)= printfn"method 1"
169+
memberthis.Foo(x:FSharpFunc<int,int>)= printfn"method 2"

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp