From 31e5fc2f1d238efe9622be398982c532eb2c3ad3 Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Wed, 25 Sep 2024 13:57:28 +0100 Subject: [PATCH 1/2] Better error reporting for `CE` `match!` --- .../Checking/Expressions/CheckExpressions.fs | 2 +- .../Language/ComputationExpressionTests.fs | 51 +++++++++++++++++++ tests/fsharp/typecheck/sigs/neg104.vsbsl | 4 +- 3 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/Compiler/Checking/Expressions/CheckExpressions.fs b/src/Compiler/Checking/Expressions/CheckExpressions.fs index d0f758967de..d2df1aff642 100644 --- a/src/Compiler/Checking/Expressions/CheckExpressions.fs +++ b/src/Compiler/Checking/Expressions/CheckExpressions.fs @@ -6004,7 +6004,7 @@ and TcExprUndelayed (cenv: cenv) (overallTy: OverallTy) env tpenv (synExpr: SynE error(Error(FSComp.SR.tcConstructRequiresSequenceOrComputations(), m)) | SynExpr.DoBang (trivia = { DoBangKeyword = m }) - | SynExpr.MatchBang (range = m) + | SynExpr.MatchBang (trivia = { MatchBangKeyword = m }) | SynExpr.WhileBang (range = m) | SynExpr.LetOrUseBang (trivia = { LetOrUseBangKeyword = m }) -> error(Error(FSComp.SR.tcConstructRequiresComputationExpression(), m)) diff --git a/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs b/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs index 027ad51ee4c..319d79aa8ea 100644 --- a/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs +++ b/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs @@ -442,4 +442,55 @@ query { |> shouldFail |> withDiagnostics [ (Error 3143, Line 4, Col 5, Line 4, Col 9, "'let!', 'use!' and 'do!' expressions may not be used in queries") + ] + + [] + let ``This control construct may only be used if the computation expression builder defines a 'Bind' method(match!)`` () = + Fsx """ +module Result = + let zip x1 x2 = + match x1,x2 with + | Ok x1res, Ok x2res -> Ok (x1res, x2res) + | Error e, _ -> Error e + | _, Error e -> Error e + +type ResultBuilder() = + member _.MergeSources(t1: Result<'T,'U>, t2: Result<'T1,'U>) = Result.zip t1 t2 + member _.BindReturn(x: Result<'T,'U>, f) = Result.map f x + member _.Delay(f) = f() + + member _.TryWith(r: Result<'T,'U>, f) = + match r with + | Ok x -> Ok x + | Error e -> f e + +let result = ResultBuilder() + +let run r2 r3 = + result { + match! r2 with + | Ok x -> return x + | Error e -> return e + } + """ + |> ignoreWarnings + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Error 708, Line 23, Col 9, Line 23, Col 15, "This control construct may only be used if the computation expression builder defines a 'Bind' method") + ] + + [] + let ``This construct may only be used within computation expressions(match!)`` () = + Fsx """ +let run r2 r3 = + match! r2 with + | Ok x -> x + | Error e -> e + """ + |> ignoreWarnings + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Error 750, Line 3, Col 5, Line 3, Col 11, "This construct may only be used within computation expressions") ] \ No newline at end of file diff --git a/tests/fsharp/typecheck/sigs/neg104.vsbsl b/tests/fsharp/typecheck/sigs/neg104.vsbsl index 12c1c451d3e..8a6059aa128 100644 --- a/tests/fsharp/typecheck/sigs/neg104.vsbsl +++ b/tests/fsharp/typecheck/sigs/neg104.vsbsl @@ -19,9 +19,9 @@ neg104.fs(35,19,35,20): parse error FS0010: Unexpected symbol '}' in definition. neg104.fs(36,1,36,1): parse error FS0010: Incomplete structured construct at or before this point in implementation file -neg104.fs(8,9,8,30): typecheck error FS0750: This construct may only be used within computation expressions +neg104.fs(8,9,8,15): typecheck error FS0750: This construct may only be used within computation expressions -neg104.fs(10,9,10,30): typecheck error FS0750: This construct may only be used within computation expressions +neg104.fs(10,9,10,15): typecheck error FS0750: This construct may only be used within computation expressions neg104.fs(20,9,20,15): typecheck error FS0025: Incomplete pattern matches on this expression. From f0daf3a303ebef031b7243b31213e967605004fd Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Wed, 25 Sep 2024 16:09:28 +0100 Subject: [PATCH 2/2] release notes --- docs/release-notes/.FSharp.Compiler.Service/9.0.200.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md b/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md index 5ef93105656..02ec15e7255 100644 --- a/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md +++ b/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md @@ -9,5 +9,6 @@ * Make ILTypeDef interface impls calculation lazy. ([PR #17392](https://github.com/dotnet/fsharp/pull/17392)) * Better ranges for CE `let!` and `use!` error reporting. ([PR #17712](https://github.com/dotnet/fsharp/pull/17712)) * Better ranges for CE `do!` error reporting. ([PR #17779](https://github.com/dotnet/fsharp/pull/17779)) +* Better ranges for CE `match!`. ([PR #17789](https://github.com/dotnet/fsharp/pull/17789)) ### Breaking Changes