Skip to content

Commit fdf96f5

Browse files
authored
Checker: recover on checking language version (#19970)
1 parent 3b7d2ac commit fdf96f5

6 files changed

Lines changed: 30 additions & 10 deletions

File tree

docs/release-notes/.FSharp.Compiler.Service/11.0.100.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@
9797
* Debug: rework for expressions stepping ([PR #19894](https://github.com/dotnet/fsharp/pull/19894))
9898
* Debug: rework conditional erasure, fix stepping over literals ([PR #19897](https://github.com/dotnet/fsharp/pull/19897))
9999
* Debug: fix if and match condition sequence points ([PR #19932](https://github.com/dotnet/fsharp/pull/19932))
100+
* Checker: recover on checking language version ([PR ##19970](https://github.com/dotnet/fsharp/pull/19970))
100101

101102
### Changed
102103

src/Compiler/Checking/CheckDeclarations.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -751,7 +751,7 @@ let TcOpenModuleOrNamespaceDecl tcSink g amap scopem env (longId, m) =
751751
let TcOpenTypeDecl (cenv: cenv) mOpenDecl scopem env (synType: SynType, m) =
752752
let g = cenv.g
753753

754-
checkLanguageFeatureError g.langVersion LanguageFeature.OpenTypeDeclaration mOpenDecl
754+
checkLanguageFeatureAndRecover g.langVersion LanguageFeature.OpenTypeDeclaration mOpenDecl
755755

756756
let ty, _tpenv = TcType cenv NoNewTypars CheckCxs ItemOccurrence.Open WarnOnIWSAM.Yes env emptyUnscopedTyparEnv synType
757757

src/Compiler/Checking/CheckFormatStrings.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ let parseFormatStringInternal
396396
let ch = fmt[i]
397397
match ch with
398398
| 'd' | 'i' | 'u' | 'B' | 'o' | 'x' | 'X' ->
399-
if ch = 'B' then checkLanguageFeatureError g.langVersion Features.LanguageFeature.PrintfBinaryFormat m
399+
if ch = 'B' then checkLanguageFeatureAndRecover g.langVersion Features.LanguageFeature.PrintfBinaryFormat m
400400
if info.precision then failwith (FSComp.SR.forFormatDoesntSupportPrecision(ch.ToString()))
401401
collectSpecifierLocation fragLine fragCol 1
402402
let i = skipPossibleInterpolationHole (i+1)

src/Compiler/Checking/CheckPatterns.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ and TcPat warnOnUpper (cenv: cenv) env valReprInfo vFlags (patEnv: TcPatLinearEn
286286

287287
match synPat with
288288
| SynPat.As (_, SynPat.Named _, _) -> ()
289-
| SynPat.As (_, _, m) -> checkLanguageFeatureError g.langVersion LanguageFeature.NonVariablePatternsToRightOfAsPatterns m
289+
| SynPat.As (_, _, m) -> checkLanguageFeatureAndRecover g.langVersion LanguageFeature.NonVariablePatternsToRightOfAsPatterns m
290290
| _ -> ()
291291

292292
match synPat with

src/Compiler/Checking/Expressions/CheckExpressions.fs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5391,7 +5391,7 @@ and TcPatLongIdentActivePatternCase warnOnUpper (cenv: cenv) (env: TcEnv) vFlags
53915391

53925392
// partial active pattern (returning bool) doesn't have output arg
53935393
if (not apinfo.IsTotal && isBoolTy g retTy) then
5394-
checkLanguageFeatureError g.langVersion LanguageFeature.BooleanReturningAndReturnTypeDirectedPartialActivePattern m
5394+
checkLanguageFeatureAndRecover g.langVersion LanguageFeature.BooleanReturningAndReturnTypeDirectedPartialActivePattern m
53955395
if paramCount = List.length args then
53965396
args, SynPat.Const(SynConst.Unit, m)
53975397
else
@@ -5946,7 +5946,7 @@ and TcExprUndelayed (cenv: cenv) (overallTy: OverallTy) env tpenv (synExpr: SynE
59465946

59475947
| SynExpr.InterpolatedString (parts, _, m) ->
59485948
TcNonControlFlowExpr env <| fun env ->
5949-
checkLanguageFeatureError g.langVersion LanguageFeature.StringInterpolation m
5949+
checkLanguageFeatureAndRecover g.langVersion LanguageFeature.StringInterpolation m
59505950
CallExprHasTypeSink cenv.tcSink (m, env.NameEnv, overallTy.Commit, env.AccessRights)
59515951
TcInterpolatedStringExpr cenv overallTy env m tpenv parts
59525952

@@ -11438,11 +11438,11 @@ and TcNormalizedBinding declKind (cenv: cenv) env tpenv overallTy safeThisValOpt
1143811438

1143911439
match apRetTy with
1144011440
| ActivePatternReturnKind.Boolean ->
11441-
checkLanguageFeatureError g.langVersion LanguageFeature.BooleanReturningAndReturnTypeDirectedPartialActivePattern mBinding
11441+
checkLanguageFeatureAndRecover g.langVersion LanguageFeature.BooleanReturningAndReturnTypeDirectedPartialActivePattern mBinding
1144211442
| ActivePatternReturnKind.StructTypeWrapper when not isStructRetTy ->
11443-
checkLanguageFeatureError g.langVersion LanguageFeature.BooleanReturningAndReturnTypeDirectedPartialActivePattern mBinding
11443+
checkLanguageFeatureAndRecover g.langVersion LanguageFeature.BooleanReturningAndReturnTypeDirectedPartialActivePattern mBinding
1144411444
| ActivePatternReturnKind.StructTypeWrapper ->
11445-
checkLanguageFeatureError g.langVersion LanguageFeature.StructActivePattern mBinding
11445+
checkLanguageFeatureAndRecover g.langVersion LanguageFeature.StructActivePattern mBinding
1144611446
| ActivePatternReturnKind.RefTypeWrapper -> ()
1144711447

1144811448
UnifyTypes cenv env mBinding (apinfo.ResultType g m activePatResTys apRetTy) apReturnTy
@@ -11933,7 +11933,7 @@ and TcLetBinding (cenv: cenv) isUse env containerInfo declKind tpenv (synBinds,
1193311933
if not isDiscarded then
1193411934
errorR(Error(FSComp.SR.tcInvalidUseBinding(), m))
1193511935
else
11936-
checkLanguageFeatureError g.langVersion LanguageFeature.UseBindingValueDiscard checkedPat.Range
11936+
checkLanguageFeatureAndRecover g.langVersion LanguageFeature.UseBindingValueDiscard checkedPat.Range
1193711937

1193811938
elif isFixed then
1193911939
errorR(Error(FSComp.SR.tcInvalidUseBinding(), m))
@@ -12287,7 +12287,7 @@ and CheckForNonAbstractInterface (g: TcGlobals) declKind tcref (memberFlags: Syn
1228712287
if not isMemberStatic then
1228812288
error(Error(FSComp.SR.tcConcreteMembersIllegalInInterface(), m))
1228912289
else
12290-
checkLanguageFeatureError g.langVersion LanguageFeature.StaticMembersInInterfaces m
12290+
checkLanguageFeatureAndRecover g.langVersion LanguageFeature.StaticMembersInInterfaces m
1229112291

1229212292
//-------------------------------------------------------------------------
1229312293
// TcLetrecBindings - AnalyzeAndMakeAndPublishRecursiveValue s

tests/FSharp.Compiler.ComponentTests/Language/BooleanReturningAndReturnTypeDirectedPartialActivePatternTests.fs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,3 +100,22 @@ match "A" with
100100
Result")
101101
(Error 3868, Line 13, Col 3, Line 13, Col 30, "This active pattern does not expect any arguments, i.e., it should be used like 'IsA' instead of 'IsA x'.")
102102
]
103+
104+
[<Fact>]
105+
let ``Language version check`` () =
106+
FSharp """
107+
let (|LessThan|_|) (other: int) x = x <= other
108+
109+
match 1 with
110+
| LessThan "" -> UnresolvedName
111+
| _ -> ()
112+
"""
113+
|> withLangVersion80
114+
|> typecheck
115+
|> shouldFail
116+
|> withDiagnostics [
117+
Error 3350, Line 2, Col 6, Line 2, Col 18, "Feature 'Boolean-returning and return-type-directed partial active patterns' is not available in F# 8.0. Please use language version 9.0 or greater."
118+
Error 3350, Line 5, Col 3, Line 5, Col 14, "Feature 'Boolean-returning and return-type-directed partial active patterns' is not available in F# 8.0. Please use language version 9.0 or greater."
119+
Error 1, Line 5, Col 12, Line 5, Col 14, "This expression was expected to have type\n 'int' \n but here has type\n 'string' "
120+
Error 39, Line 5, Col 18, Line 5, Col 32, "The value or constructor 'UnresolvedName' is not defined."
121+
]

0 commit comments

Comments
 (0)