Skip to content

Commit e2f3a3e

Browse files
authored
No errors for non-virtual members overrides (dotnet#14263)
* No errors for non virtual members overrides * Check for isFSharpObjModelTy as we are interested on csharp virtual methods * More testing * Add a feature lang preview * More testing * Fix PR comment
1 parent b9d1bc3 commit e2f3a3e

18 files changed

+512
-7
lines changed

src/Compiler/Checking/CheckExpressions.fs

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10950,7 +10950,7 @@ and ComputeIsComplete enclosingDeclaredTypars declaredTypars ty =
1095010950
/// Determine if a uniquely-identified-abstract-slot exists for an override member (or interface member implementation) based on the information available
1095110951
/// 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
1095210952
/// it implements. Apply the inferred slotsig.
10953-
and ApplyAbstractSlotInference (cenv: cenv) (envinner: TcEnv) (argsAndRetTy, m, synTyparDecls, declaredTypars, memberId, tcrefObjTy, renaming, _objTy, intfSlotTyOpt, valSynData, memberFlags: SynMemberFlags, attribs) =
10953+
and ApplyAbstractSlotInference (cenv: cenv) (envinner: TcEnv) (baseValOpt: Val option) (argsAndRetTy, m, synTyparDecls, declaredTypars, memberId, tcrefObjTy, renaming, intfSlotTyOpt, valSynData, memberFlags: SynMemberFlags, attribs) =
1095410954

1095510955
let g = cenv.g
1095610956
let ad = envinner.eAccessRights
@@ -10997,7 +10997,21 @@ and ApplyAbstractSlotInference (cenv: cenv) (envinner: TcEnv) (argsAndRetTy, m,
1099710997
| _ -> [] // check that method to override is sealed is located at CheckOverridesAreAllUsedOnce (typrelns.fs)
1099810998
// We hit this case when it is ambiguous which abstract method is being implemented.
1099910999

11000-
11000+
if g.langVersion.SupportsFeature(LanguageFeature.ErrorForNonVirtualMembersOverrides) then
11001+
// Checks if the declaring type inherits from a base class and is not FSharpObjModelTy
11002+
// Raises an error if we try to override an non virtual member with the same name in both
11003+
match baseValOpt with
11004+
| Some ttype when not(isFSharpObjModelTy g ttype.Type) ->
11005+
match stripTyEqns g ttype.Type with
11006+
| TType_app(tyconRef, _, _) ->
11007+
let ilMethods = tyconRef.ILTyconRawMetadata.Methods.AsList()
11008+
let nameOpt = ilMethods |> List.tryFind(fun id -> id.Name = memberId.idText)
11009+
match nameOpt with
11010+
| Some name when not name.IsVirtual ->
11011+
errorR(Error(FSComp.SR.tcNoMemberFoundForOverride(), memberId.idRange))
11012+
| _ -> ()
11013+
| _ -> ()
11014+
| _ -> ()
1100111015

1100211016
// If we determined a unique member then utilize the type information from the slotsig
1100311017
let declaredTypars =
@@ -11159,14 +11173,14 @@ and AnalyzeRecursiveStaticMemberOrValDecl
1115911173
CheckForNonAbstractInterface declKind tcref memberFlags id.idRange
1116011174

1116111175
let isExtrinsic = (declKind = ExtrinsicExtensionBinding)
11162-
let tcrefObjTy, enclosingDeclaredTypars, renaming, objTy, _ = FreshenObjectArgType cenv mBinding TyparRigidity.WillBeRigid tcref isExtrinsic declaredTyconTypars
11176+
let tcrefObjTy, enclosingDeclaredTypars, renaming, _, _ = FreshenObjectArgType cenv mBinding TyparRigidity.WillBeRigid tcref isExtrinsic declaredTyconTypars
1116311177
let envinner = AddDeclaredTypars CheckForDuplicateTypars enclosingDeclaredTypars envinner
1116411178
let envinner = MakeInnerEnvForTyconRef envinner tcref isExtrinsic
1116511179

1116611180
let (ExplicitTyparInfo(_, declaredTypars, infer)) = explicitTyparInfo
1116711181

1116811182
let optInferredImplSlotTys, declaredTypars =
11169-
ApplyAbstractSlotInference cenv envinner (ty, mBinding, synTyparDecls, declaredTypars, id, tcrefObjTy, renaming, objTy, intfSlotTyOpt, valSynInfo, memberFlags, bindingAttribs)
11183+
ApplyAbstractSlotInference cenv envinner None (ty, mBinding, synTyparDecls, declaredTypars, id, tcrefObjTy, renaming, intfSlotTyOpt, valSynInfo, memberFlags, bindingAttribs)
1117011184

1117111185
let explicitTyparInfo = ExplicitTyparInfo(declaredTypars, declaredTypars, infer)
1117211186

@@ -11231,7 +11245,6 @@ and AnalyzeRecursiveStaticMemberOrValDecl
1123111245
| _ ->
1123211246
envinner, tpenv, id, None, None, vis, vis2, None, [], None, explicitTyparInfo, bindingRhs, declaredTypars
1123311247

11234-
1123511248
and AnalyzeRecursiveInstanceMemberDecl
1123611249
(cenv: cenv,
1123711250
envinner: TcEnv,
@@ -11290,7 +11303,7 @@ and AnalyzeRecursiveInstanceMemberDecl
1129011303
// at the member signature. If so, we know the type of this member, and the full slotsig
1129111304
// it implements. Apply the inferred slotsig.
1129211305
let optInferredImplSlotTys, declaredTypars =
11293-
ApplyAbstractSlotInference cenv envinner (argsAndRetTy, mBinding, synTyparDecls, declaredTypars, memberId, tcrefObjTy, renaming, objTy, intfSlotTyOpt, valSynInfo, memberFlags, bindingAttribs)
11306+
ApplyAbstractSlotInference cenv envinner baseValOpt (argsAndRetTy, mBinding, synTyparDecls, declaredTypars, memberId, tcrefObjTy, renaming, intfSlotTyOpt, valSynInfo, memberFlags, bindingAttribs)
1129411307

1129511308
// Update the ExplicitTyparInfo to reflect the declaredTypars inferred from the abstract slot
1129611309
let explicitTyparInfo = ExplicitTyparInfo(declaredTypars, declaredTypars, infer)

src/Compiler/FSComp.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1561,6 +1561,7 @@ featureInitProperties,"support for consuming init properties"
15611561
featureLowercaseDUWhenRequireQualifiedAccess,"Allow lowercase DU when RequireQualifiedAccess attribute"
15621562
featureMatchNotAllowedForUnionCaseWithNoData,"Pattern match discard is not allowed for union case that takes no data."
15631563
featureCSharpExtensionAttributeNotRequired,"Allow implicit Extension attribute on declaring types, modules"
1564+
featureErrorForNonVirtualMembersOverrides,"Raises errors for non-virtual members overrides"
15641565
3353,fsiInvalidDirective,"Invalid directive '#%s %s'"
15651566
3354,tcNotAFunctionButIndexerNamedIndexingNotYetEnabled,"This value supports indexing, e.g. '%s.[index]'. The syntax '%s[index]' requires /langversion:preview. See https://aka.ms/fsharp-index-notation."
15661567
3354,tcNotAFunctionButIndexerIndexingNotYetEnabled,"This expression supports indexing, e.g. 'expr.[index]'. The syntax 'expr[index]' requires /langversion:preview. See https://aka.ms/fsharp-index-notation."

src/Compiler/Facilities/LanguageFeatures.fs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ type LanguageFeature =
5656
| SelfTypeConstraints
5757
| MatchNotAllowedForUnionCaseWithNoData
5858
| CSharpExtensionAttributeNotRequired
59+
| ErrorForNonVirtualMembersOverrides
5960

6061
/// LanguageVersion management
6162
type LanguageVersion(versionText) =
@@ -128,6 +129,7 @@ type LanguageVersion(versionText) =
128129
LanguageFeature.FromEndSlicing, previewVersion
129130
LanguageFeature.MatchNotAllowedForUnionCaseWithNoData, previewVersion
130131
LanguageFeature.CSharpExtensionAttributeNotRequired, previewVersion
132+
LanguageFeature.ErrorForNonVirtualMembersOverrides, previewVersion
131133

132134
]
133135

@@ -237,6 +239,7 @@ type LanguageVersion(versionText) =
237239
| LanguageFeature.SelfTypeConstraints -> FSComp.SR.featureSelfTypeConstraints ()
238240
| LanguageFeature.MatchNotAllowedForUnionCaseWithNoData -> FSComp.SR.featureMatchNotAllowedForUnionCaseWithNoData ()
239241
| LanguageFeature.CSharpExtensionAttributeNotRequired -> FSComp.SR.featureCSharpExtensionAttributeNotRequired ()
242+
| LanguageFeature.ErrorForNonVirtualMembersOverrides -> FSComp.SR.featureErrorForNonVirtualMembersOverrides ()
240243

241244
/// Get a version string associated with the given feature.
242245
static member GetFeatureVersionString feature =

src/Compiler/Facilities/LanguageFeatures.fsi

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ type LanguageFeature =
4646
| SelfTypeConstraints
4747
| MatchNotAllowedForUnionCaseWithNoData
4848
| CSharpExtensionAttributeNotRequired
49+
| ErrorForNonVirtualMembersOverrides
4950

5051
/// LanguageVersion management
5152
type LanguageVersion =

src/Compiler/xlf/FSComp.txt.cs.xlf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,11 @@
177177
<target state="translated">literál float32 bez tečky</target>
178178
<note />
179179
</trans-unit>
180+
<trans-unit id="featureErrorForNonVirtualMembersOverrides">
181+
<source>Raises errors for non-virtual members overrides</source>
182+
<target state="new">Raises errors for non-virtual members overrides</target>
183+
<note />
184+
</trans-unit>
180185
<trans-unit id="featureErrorOnDeprecatedRequireQualifiedAccess">
181186
<source>give error on deprecated access of construct with RequireQualifiedAccess attribute</source>
182187
<target state="translated">chyba při zastaralém přístupu konstruktoru s atributem RequireQualifiedAccess</target>

src/Compiler/xlf/FSComp.txt.de.xlf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,11 @@
177177
<target state="translated">punktloses float32-Literal</target>
178178
<note />
179179
</trans-unit>
180+
<trans-unit id="featureErrorForNonVirtualMembersOverrides">
181+
<source>Raises errors for non-virtual members overrides</source>
182+
<target state="new">Raises errors for non-virtual members overrides</target>
183+
<note />
184+
</trans-unit>
180185
<trans-unit id="featureErrorOnDeprecatedRequireQualifiedAccess">
181186
<source>give error on deprecated access of construct with RequireQualifiedAccess attribute</source>
182187
<target state="translated">Beim veralteten Zugriff auf das Konstrukt mit dem RequireQualifiedAccess-Attribut wird ein Fehler ausgegeben.</target>

src/Compiler/xlf/FSComp.txt.es.xlf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,11 @@
177177
<target state="translated">literal float32 sin punto</target>
178178
<note />
179179
</trans-unit>
180+
<trans-unit id="featureErrorForNonVirtualMembersOverrides">
181+
<source>Raises errors for non-virtual members overrides</source>
182+
<target state="new">Raises errors for non-virtual members overrides</target>
183+
<note />
184+
</trans-unit>
180185
<trans-unit id="featureErrorOnDeprecatedRequireQualifiedAccess">
181186
<source>give error on deprecated access of construct with RequireQualifiedAccess attribute</source>
182187
<target state="translated">error en el acceso en desuso de la construcción con el atributo RequireQualifiedAccess</target>

src/Compiler/xlf/FSComp.txt.fr.xlf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,11 @@
177177
<target state="translated">littéral float32 sans point</target>
178178
<note />
179179
</trans-unit>
180+
<trans-unit id="featureErrorForNonVirtualMembersOverrides">
181+
<source>Raises errors for non-virtual members overrides</source>
182+
<target state="new">Raises errors for non-virtual members overrides</target>
183+
<note />
184+
</trans-unit>
180185
<trans-unit id="featureErrorOnDeprecatedRequireQualifiedAccess">
181186
<source>give error on deprecated access of construct with RequireQualifiedAccess attribute</source>
182187
<target state="translated">donner une erreur sur l’accès déconseillé de la construction avec l’attribut RequireQualifiedAccess</target>

src/Compiler/xlf/FSComp.txt.it.xlf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,11 @@
177177
<target state="translated">valore letterale float32 senza punti</target>
178178
<note />
179179
</trans-unit>
180+
<trans-unit id="featureErrorForNonVirtualMembersOverrides">
181+
<source>Raises errors for non-virtual members overrides</source>
182+
<target state="new">Raises errors for non-virtual members overrides</target>
183+
<note />
184+
</trans-unit>
180185
<trans-unit id="featureErrorOnDeprecatedRequireQualifiedAccess">
181186
<source>give error on deprecated access of construct with RequireQualifiedAccess attribute</source>
182187
<target state="translated">errore durante l'accesso deprecato del costrutto con l'attributo RequireQualifiedAccess</target>

src/Compiler/xlf/FSComp.txt.ja.xlf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,11 @@
177177
<target state="translated">ドットなしの float32 リテラル</target>
178178
<note />
179179
</trans-unit>
180+
<trans-unit id="featureErrorForNonVirtualMembersOverrides">
181+
<source>Raises errors for non-virtual members overrides</source>
182+
<target state="new">Raises errors for non-virtual members overrides</target>
183+
<note />
184+
</trans-unit>
180185
<trans-unit id="featureErrorOnDeprecatedRequireQualifiedAccess">
181186
<source>give error on deprecated access of construct with RequireQualifiedAccess attribute</source>
182187
<target state="translated">RequireQualifiedAccess 属性を持つコンストラクトの非推奨アクセスでエラーが発生しました</target>

0 commit comments

Comments
 (0)