From 10ef6cce9762ae5be3a2bb0e8fc82f8a41dcc14c Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Fri, 27 Sep 2024 14:00:34 +0100 Subject: [PATCH 01/10] Better error reporting for `use` --- .../CheckComputationExpressions.fs | 7 +-- .../Expressions/CheckSequenceExpressions.fs | 10 ++-- src/Compiler/SyntaxTree/ParseHelpers.fs | 7 ++- src/Compiler/SyntaxTree/SyntaxTrivia.fs | 3 +- src/Compiler/SyntaxTree/SyntaxTrivia.fsi | 2 + .../Language/ComputationExpressionTests.fs | 50 ++++++++++++++++++- tests/fsharp/typecheck/sigs/neg61.bsl | 2 +- 7 files changed, 65 insertions(+), 16 deletions(-) diff --git a/src/Compiler/Checking/Expressions/CheckComputationExpressions.fs b/src/Compiler/Checking/Expressions/CheckComputationExpressions.fs index d328f6a310a..6a800443168 100644 --- a/src/Compiler/Checking/Expressions/CheckComputationExpressions.fs +++ b/src/Compiler/Checking/Expressions/CheckComputationExpressions.fs @@ -1801,11 +1801,8 @@ let rec TryTranslateComputationExpression | SynExpr.LetOrUse( isUse = true bindings = [ SynBinding(kind = SynBindingKind.Normal; headPat = pat; expr = rhsExpr; debugPoint = spBind) ] - body = innerComp) -> - let mBind = - match spBind with - | DebugPointAtBinding.Yes m -> m - | _ -> rhsExpr.Range + body = innerComp + trivia = { LetOrUseKeyword = mBind }) -> if ceenv.isQuery then error (Error(FSComp.SR.tcUseMayNotBeUsedInQueries (), mBind)) diff --git a/src/Compiler/Checking/Expressions/CheckSequenceExpressions.fs b/src/Compiler/Checking/Expressions/CheckSequenceExpressions.fs index b627eef2922..5f57d7da60f 100644 --- a/src/Compiler/Checking/Expressions/CheckSequenceExpressions.fs +++ b/src/Compiler/Checking/Expressions/CheckSequenceExpressions.fs @@ -232,9 +232,10 @@ let TcSequenceExpression (cenv: TcFileState) env tpenv comp (overallTy: OverallT // 'use x = expr in expr' | SynExpr.LetOrUse( isUse = true - bindings = [ SynBinding(kind = SynBindingKind.Normal; headPat = pat; expr = rhsExpr; debugPoint = spBind) ] + bindings = [ SynBinding(kind = SynBindingKind.Normal; headPat = pat; expr = rhsExpr) ] body = innerComp - range = wholeExprMark) -> + range = wholeExprMark + trivia = { LetOrUseKeyword = mBind }) -> let bindPatTy = NewInferenceType g let inputExprTy = NewInferenceType g @@ -252,11 +253,6 @@ let TcSequenceExpression (cenv: TcFileState) env tpenv comp (overallTy: OverallT let envinner = { envinner with eIsControlFlow = true } tcSequenceExprBody envinner genOuterTy tpenv innerComp - let mBind = - match spBind with - | DebugPointAtBinding.Yes m -> m.NoteSourceConstruct(NotedSourceConstruct.Binding) - | _ -> inputExpr.Range - let inputExprMark = inputExpr.Range let matchv, matchExpr = diff --git a/src/Compiler/SyntaxTree/ParseHelpers.fs b/src/Compiler/SyntaxTree/ParseHelpers.fs index 22c27eeb9b0..97ec34bdead 100644 --- a/src/Compiler/SyntaxTree/ParseHelpers.fs +++ b/src/Compiler/SyntaxTree/ParseHelpers.fs @@ -1048,8 +1048,13 @@ let mkLocalBindings (mWhole, BindingSetPreAttrs(_, isRec, isUse, declsPreAttrs, None else Some mIn) + + let mLetOrUse = + match decls with + | SynBinding(trivia = trivia) :: _ -> trivia.LeadingKeyword.Range + | _ -> Range.Zero - SynExpr.LetOrUse(isRec, isUse, decls, body, mWhole, { InKeyword = mIn }) + SynExpr.LetOrUse(isRec, isUse, decls, body, mWhole, { LetOrUseKeyword = mLetOrUse ; InKeyword = mIn }) let mkDefnBindings (mWhole, BindingSetPreAttrs(_, isRec, isUse, declsPreAttrs, _bindingSetRange), attrs, vis, attrsm) = if isUse then diff --git a/src/Compiler/SyntaxTree/SyntaxTrivia.fs b/src/Compiler/SyntaxTree/SyntaxTrivia.fs index 7e03572719e..9bf1465c010 100644 --- a/src/Compiler/SyntaxTree/SyntaxTrivia.fs +++ b/src/Compiler/SyntaxTree/SyntaxTrivia.fs @@ -85,10 +85,11 @@ type SynExprDotLambdaTrivia = [] type SynExprLetOrUseTrivia = { + LetOrUseKeyword: range InKeyword: range option } - static member Zero: SynExprLetOrUseTrivia = { InKeyword = None } + static member Zero: SynExprLetOrUseTrivia = { InKeyword = None; LetOrUseKeyword = Range.Zero } [] type SynExprLetOrUseBangTrivia = diff --git a/src/Compiler/SyntaxTree/SyntaxTrivia.fsi b/src/Compiler/SyntaxTree/SyntaxTrivia.fsi index 3c678a72679..f12afad99fe 100644 --- a/src/Compiler/SyntaxTree/SyntaxTrivia.fsi +++ b/src/Compiler/SyntaxTree/SyntaxTrivia.fsi @@ -129,6 +129,8 @@ type SynExprDotLambdaTrivia = [] type SynExprLetOrUseTrivia = { + /// The syntax range of the `let` or `use` keyword. + LetOrUseKeyword: range /// The syntax range of the `in` keyword. InKeyword: range option } diff --git a/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs b/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs index 319d79aa8ea..0e84d0144ac 100644 --- a/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs +++ b/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs @@ -493,4 +493,52 @@ let run r2 r3 = |> 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 + ] + + [] + let ``use expressions may not be used in queries(SynExpr.Sequential)`` () = + Fsx """ +let x11 = + query { for c in [1..10] do + use x = { new System.IDisposable with __.Dispose() = () } + yield 1 } + """ + |> ignoreWarnings + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Error 3142, Line 4, Col 13, Line 4, Col 16, "'use' expressions may not be used in queries") + ] + + [] + let ``use, This control construct may only be used if the computation expression builder defines a 'Using' method`` () = + 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 _.YieldReturn(x: Result<'T,'U>) = x + member _.Return(x: 'T) = Ok x + +let result = ResultBuilder() + +let run r2 r3 = + result { + use b = r2 + return Ok 0 + } + """ + |> ignoreWarnings + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Error 708, Line 20, Col 9, Line 20, Col 12, "This control construct may only be used if the computation expression builder defines a 'Using' method") + ] + \ No newline at end of file diff --git a/tests/fsharp/typecheck/sigs/neg61.bsl b/tests/fsharp/typecheck/sigs/neg61.bsl index 91291a6cb94..014af35d598 100644 --- a/tests/fsharp/typecheck/sigs/neg61.bsl +++ b/tests/fsharp/typecheck/sigs/neg61.bsl @@ -57,7 +57,7 @@ neg61.fs(79,13,79,16): typecheck error FS3146: 'try/with' expressions may not be neg61.fs(86,13,86,16): typecheck error FS3141: 'try/finally' expressions may not be used in queries -neg61.fs(92,13,92,70): typecheck error FS3142: 'use' expressions may not be used in queries +neg61.fs(92,13,92,15): typecheck error FS3142: 'use' expressions may not be used in queries neg61.fs(97,13,97,17): typecheck error FS3143: 'let!', 'use!' and 'do!' expressions may not be used in queries From 646dc56463b4cb6baae4cf4fa19c0d07cc78b578 Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Fri, 27 Sep 2024 14:59:52 +0100 Subject: [PATCH 02/10] 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 24b85706238..7613911e331 100644 --- a/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md +++ b/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md @@ -11,5 +11,6 @@ * 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)) +* Better ranges for CE `use` error reporting. ([PR #17811](https://github.com/dotnet/fsharp/pull/17811)) ### Breaking Changes From c8cbbee9817af67207c2e7accb1a07a890d78c2e Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Fri, 27 Sep 2024 15:09:07 +0100 Subject: [PATCH 03/10] format code --- src/Compiler/SyntaxTree/ParseHelpers.fs | 14 ++++++++++++-- src/Compiler/SyntaxTree/SyntaxTrivia.fs | 6 +++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/Compiler/SyntaxTree/ParseHelpers.fs b/src/Compiler/SyntaxTree/ParseHelpers.fs index 97ec34bdead..73eef4752e6 100644 --- a/src/Compiler/SyntaxTree/ParseHelpers.fs +++ b/src/Compiler/SyntaxTree/ParseHelpers.fs @@ -1048,13 +1048,23 @@ let mkLocalBindings (mWhole, BindingSetPreAttrs(_, isRec, isUse, declsPreAttrs, None else Some mIn) - + let mLetOrUse = match decls with | SynBinding(trivia = trivia) :: _ -> trivia.LeadingKeyword.Range | _ -> Range.Zero - SynExpr.LetOrUse(isRec, isUse, decls, body, mWhole, { LetOrUseKeyword = mLetOrUse ; InKeyword = mIn }) + SynExpr.LetOrUse( + isRec, + isUse, + decls, + body, + mWhole, + { + LetOrUseKeyword = mLetOrUse + InKeyword = mIn + } + ) let mkDefnBindings (mWhole, BindingSetPreAttrs(_, isRec, isUse, declsPreAttrs, _bindingSetRange), attrs, vis, attrsm) = if isUse then diff --git a/src/Compiler/SyntaxTree/SyntaxTrivia.fs b/src/Compiler/SyntaxTree/SyntaxTrivia.fs index 9bf1465c010..c39144d6195 100644 --- a/src/Compiler/SyntaxTree/SyntaxTrivia.fs +++ b/src/Compiler/SyntaxTree/SyntaxTrivia.fs @@ -89,7 +89,11 @@ type SynExprLetOrUseTrivia = InKeyword: range option } - static member Zero: SynExprLetOrUseTrivia = { InKeyword = None; LetOrUseKeyword = Range.Zero } + static member Zero: SynExprLetOrUseTrivia = + { + InKeyword = None + LetOrUseKeyword = Range.Zero + } [] type SynExprLetOrUseBangTrivia = From 53e8fc902d2b6d121fb6ee2c3390a2a1a2e9aa24 Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Fri, 27 Sep 2024 16:36:00 +0100 Subject: [PATCH 04/10] Update SyntaxTree tests --- .../Binding/InlineKeywordInBinding.fs.bsl | 17 +++++++++-------- ...lSignShouldBePresentInLocalLetBinding.fs.bsl | 11 ++++++----- ...ShouldBePresentInLocalLetBindingTyped.fs.bsl | 11 ++++++----- ...ouldBePresentInSynExprLetOrUseBinding.fs.bsl | 17 +++++++++-------- ...prLetOrUseContainsTheRangeOfInKeyword.fs.bsl | 3 ++- ...rUseDoesNotContainTheRangeOfInKeyword.fs.bsl | 11 ++++++----- ...tersDoesNotContainTheRangeOfInKeyword.fs.bsl | 3 ++- ...iveBindingContainsTheRangeOfInKeyword.fs.bsl | 3 ++- .../Try with - Missing expr 04.fs.bsl | 3 ++- .../SyntaxTree/LeadingKeyword/UseKeyword.fs.bsl | 11 ++++++----- .../LeadingKeyword/UseRecKeyword.fs.bsl | 11 ++++++----- .../RangeOfMultipleSynMatchClause.fs.bsl | 3 ++- .../RangeOfSingleSynMatchClause.fs.bsl | 3 ++- ...geOfSingleSynMatchClauseFollowedByBar.fs.bsl | 3 ++- .../Pattern/Typed - Missing type 05.fs.bsl | 3 ++- .../Pattern/Typed - Missing type 06.fs.bsl | 5 +++-- .../Pattern/Typed - Missing type 09.fs.bsl | 3 ++- .../Pattern/Typed - Missing type 10.fs.bsl | 5 +++-- .../Pattern/Typed - Missing type 11.fs.bsl | 5 +++-- .../Pattern/Typed - Missing type 12.fs.bsl | 5 +++-- .../InterpolatedStringOffsideInNestedLet.fs.bsl | 3 ++- 21 files changed, 80 insertions(+), 59 deletions(-) diff --git a/tests/service/data/SyntaxTree/Binding/InlineKeywordInBinding.fs.bsl b/tests/service/data/SyntaxTree/Binding/InlineKeywordInBinding.fs.bsl index 5a7bf976186..596eb100812 100644 --- a/tests/service/data/SyntaxTree/Binding/InlineKeywordInBinding.fs.bsl +++ b/tests/service/data/SyntaxTree/Binding/InlineKeywordInBinding.fs.bsl @@ -44,11 +44,12 @@ ImplFile { LeadingKeyword = Let (3,4--3,7) InlineKeyword = Some (3,8--3,14) EqualsRange = Some (3,21--3,22) })], - Const (Unit, (4,4--4,6)), (3,4--4,6), { InKeyword = None }), - (2,11--2,16), NoneAtLet, { LeadingKeyword = Let (2,0--2,3) - InlineKeyword = Some (2,4--2,10) - EqualsRange = Some (2,17--2,18) })], - (2,0--4,6))], PreXmlDocEmpty, [], None, (2,0--5,0), - { LeadingKeyword = None })], (true, true), - { ConditionalDirectives = [] - CodeComments = [] }, set [])) + Const (Unit, (4,4--4,6)), (3,4--4,6), + { LetOrUseKeyword = (3,4--3,7) + InKeyword = None }), (2,11--2,16), NoneAtLet, + { LeadingKeyword = Let (2,0--2,3) + InlineKeyword = Some (2,4--2,10) + EqualsRange = Some (2,17--2,18) })], (2,0--4,6))], + PreXmlDocEmpty, [], None, (2,0--5,0), { LeadingKeyword = None })], + (true, true), { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Binding/RangeOfEqualSignShouldBePresentInLocalLetBinding.fs.bsl b/tests/service/data/SyntaxTree/Binding/RangeOfEqualSignShouldBePresentInLocalLetBinding.fs.bsl index 844946e66c3..e3156b5c3b5 100644 --- a/tests/service/data/SyntaxTree/Binding/RangeOfEqualSignShouldBePresentInLocalLetBinding.fs.bsl +++ b/tests/service/data/SyntaxTree/Binding/RangeOfEqualSignShouldBePresentInLocalLetBinding.fs.bsl @@ -20,8 +20,9 @@ ImplFile Yes (3,4--3,13), { LeadingKeyword = Let (3,4--3,7) InlineKeyword = None EqualsRange = Some (3,10--3,11) })], - Const (Unit, (4,4--4,6)), (3,4--4,6), { InKeyword = None }), - (2,0--4,6)), (2,0--4,6))], PreXmlDocEmpty, [], None, (2,0--5,0), - { LeadingKeyword = None })], (true, true), - { ConditionalDirectives = [] - CodeComments = [] }, set [])) + Const (Unit, (4,4--4,6)), (3,4--4,6), + { LetOrUseKeyword = (3,4--3,7) + InKeyword = None }), (2,0--4,6)), (2,0--4,6))], + PreXmlDocEmpty, [], None, (2,0--5,0), { LeadingKeyword = None })], + (true, true), { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Binding/RangeOfEqualSignShouldBePresentInLocalLetBindingTyped.fs.bsl b/tests/service/data/SyntaxTree/Binding/RangeOfEqualSignShouldBePresentInLocalLetBindingTyped.fs.bsl index b0e567ed3bd..93dabea4c82 100644 --- a/tests/service/data/SyntaxTree/Binding/RangeOfEqualSignShouldBePresentInLocalLetBindingTyped.fs.bsl +++ b/tests/service/data/SyntaxTree/Binding/RangeOfEqualSignShouldBePresentInLocalLetBindingTyped.fs.bsl @@ -30,8 +30,9 @@ ImplFile { LeadingKeyword = Let (3,4--3,7) InlineKeyword = None EqualsRange = Some (3,15--3,16) })], - Const (Unit, (4,4--4,6)), (3,4--4,6), { InKeyword = None }), - (2,0--4,6)), (2,0--4,6))], PreXmlDocEmpty, [], None, (2,0--5,0), - { LeadingKeyword = None })], (true, true), - { ConditionalDirectives = [] - CodeComments = [] }, set [])) + Const (Unit, (4,4--4,6)), (3,4--4,6), + { LetOrUseKeyword = (3,4--3,7) + InKeyword = None }), (2,0--4,6)), (2,0--4,6))], + PreXmlDocEmpty, [], None, (2,0--5,0), { LeadingKeyword = None })], + (true, true), { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Binding/RangeOfLetKeywordShouldBePresentInSynExprLetOrUseBinding.fs.bsl b/tests/service/data/SyntaxTree/Binding/RangeOfLetKeywordShouldBePresentInSynExprLetOrUseBinding.fs.bsl index 31febede5b6..86775dec80c 100644 --- a/tests/service/data/SyntaxTree/Binding/RangeOfLetKeywordShouldBePresentInSynExprLetOrUseBinding.fs.bsl +++ b/tests/service/data/SyntaxTree/Binding/RangeOfLetKeywordShouldBePresentInSynExprLetOrUseBinding.fs.bsl @@ -34,11 +34,12 @@ ImplFile NoneAtLet, { LeadingKeyword = Let (3,4--3,7) InlineKeyword = None EqualsRange = Some (3,12--3,13) })], - Const (Unit, (4,4--4,6)), (3,4--4,6), { InKeyword = None }), - (2,4--2,5), NoneAtLet, { LeadingKeyword = Let (2,0--2,3) - InlineKeyword = None - EqualsRange = Some (2,6--2,7) })], - (2,0--4,6))], PreXmlDocEmpty, [], None, (2,0--5,0), - { LeadingKeyword = None })], (true, true), - { ConditionalDirectives = [] - CodeComments = [] }, set [])) + Const (Unit, (4,4--4,6)), (3,4--4,6), + { LetOrUseKeyword = (3,4--3,7) + InKeyword = None }), (2,4--2,5), NoneAtLet, + { LeadingKeyword = Let (2,0--2,3) + InlineKeyword = None + EqualsRange = Some (2,6--2,7) })], (2,0--4,6))], + PreXmlDocEmpty, [], None, (2,0--5,0), { LeadingKeyword = None })], + (true, true), { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Expression/SynExprLetOrUseContainsTheRangeOfInKeyword.fs.bsl b/tests/service/data/SyntaxTree/Expression/SynExprLetOrUseContainsTheRangeOfInKeyword.fs.bsl index f9ce333429a..5408f5d71d1 100644 --- a/tests/service/data/SyntaxTree/Expression/SynExprLetOrUseContainsTheRangeOfInKeyword.fs.bsl +++ b/tests/service/data/SyntaxTree/Expression/SynExprLetOrUseContainsTheRangeOfInKeyword.fs.bsl @@ -19,7 +19,8 @@ ImplFile InlineKeyword = None EqualsRange = Some (2,6--2,7) })], Const (Unit, (2,13--2,15)), (2,0--2,15), - { InKeyword = Some (2,10--2,12) }), (2,0--2,15))], + { LetOrUseKeyword = (2,0--2,3) + InKeyword = Some (2,10--2,12) }), (2,0--2,15))], PreXmlDocEmpty, [], None, (2,0--2,15), { LeadingKeyword = None })], (true, true), { ConditionalDirectives = [] CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Expression/SynExprLetOrUseDoesNotContainTheRangeOfInKeyword.fs.bsl b/tests/service/data/SyntaxTree/Expression/SynExprLetOrUseDoesNotContainTheRangeOfInKeyword.fs.bsl index 54c3f8180e4..bb9dcafe15f 100644 --- a/tests/service/data/SyntaxTree/Expression/SynExprLetOrUseDoesNotContainTheRangeOfInKeyword.fs.bsl +++ b/tests/service/data/SyntaxTree/Expression/SynExprLetOrUseDoesNotContainTheRangeOfInKeyword.fs.bsl @@ -21,8 +21,9 @@ ImplFile Yes (3,0--3,9), { LeadingKeyword = Let (3,0--3,3) InlineKeyword = None EqualsRange = Some (3,6--3,7) })], - Const (Unit, (4,0--4,2)), (3,0--4,2), { InKeyword = None }), - (2,0--4,2)), (2,0--4,2))], PreXmlDocEmpty, [], None, (2,0--5,0), - { LeadingKeyword = None })], (true, true), - { ConditionalDirectives = [] - CodeComments = [] }, set [])) + Const (Unit, (4,0--4,2)), (3,0--4,2), + { LetOrUseKeyword = (3,0--3,3) + InKeyword = None }), (2,0--4,2)), (2,0--4,2))], + PreXmlDocEmpty, [], None, (2,0--5,0), { LeadingKeyword = None })], + (true, true), { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Expression/SynExprLetOrUseWhereBodyExprStartsWithTokenOfTwoCharactersDoesNotContainTheRangeOfInKeyword.fs.bsl b/tests/service/data/SyntaxTree/Expression/SynExprLetOrUseWhereBodyExprStartsWithTokenOfTwoCharactersDoesNotContainTheRangeOfInKeyword.fs.bsl index a5d102356f1..554f4eb21ef 100644 --- a/tests/service/data/SyntaxTree/Expression/SynExprLetOrUseWhereBodyExprStartsWithTokenOfTwoCharactersDoesNotContainTheRangeOfInKeyword.fs.bsl +++ b/tests/service/data/SyntaxTree/Expression/SynExprLetOrUseWhereBodyExprStartsWithTokenOfTwoCharactersDoesNotContainTheRangeOfInKeyword.fs.bsl @@ -40,7 +40,8 @@ ImplFile SynLongIdent ([e1; Value], [(4,10--4,11)], [None; None]), None, (4,8--4,16))], [(4,6--4,7)], (4,0--4,16)), - (3,0--4,16), { InKeyword = None }), (2,0--4,16)), + (3,0--4,16), { LetOrUseKeyword = (3,0--3,3) + InKeyword = None }), (2,0--4,16)), (2,0--4,16))], PreXmlDocEmpty, [], None, (2,0--5,0), { LeadingKeyword = None })], (true, true), { ConditionalDirectives = [] diff --git a/tests/service/data/SyntaxTree/Expression/SynExprLetOrUseWithRecursiveBindingContainsTheRangeOfInKeyword.fs.bsl b/tests/service/data/SyntaxTree/Expression/SynExprLetOrUseWithRecursiveBindingContainsTheRangeOfInKeyword.fs.bsl index 72352706810..8b57f33b953 100644 --- a/tests/service/data/SyntaxTree/Expression/SynExprLetOrUseWithRecursiveBindingContainsTheRangeOfInKeyword.fs.bsl +++ b/tests/service/data/SyntaxTree/Expression/SynExprLetOrUseWithRecursiveBindingContainsTheRangeOfInKeyword.fs.bsl @@ -35,7 +35,8 @@ ImplFile InlineKeyword = None EqualsRange = Some (4,10--4,11) })], Const (Unit, (5,4--5,6)), (3,4--5,6), - { InKeyword = Some (4,15--4,17) }), (2,0--5,6)), (2,0--5,6))], + { LetOrUseKeyword = (3,4--3,11) + InKeyword = Some (4,15--4,17) }), (2,0--5,6)), (2,0--5,6))], PreXmlDocEmpty, [], None, (2,0--6,0), { LeadingKeyword = None })], (true, true), { ConditionalDirectives = [] CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/Expression/Try with - Missing expr 04.fs.bsl b/tests/service/data/SyntaxTree/Expression/Try with - Missing expr 04.fs.bsl index 94ee31ce8d1..74221e70a5f 100644 --- a/tests/service/data/SyntaxTree/Expression/Try with - Missing expr 04.fs.bsl +++ b/tests/service/data/SyntaxTree/Expression/Try with - Missing expr 04.fs.bsl @@ -19,7 +19,8 @@ ImplFile InlineKeyword = None EqualsRange = Some (5,6--5,7) })], ArbitraryAfterError ("seqExpr", (5,10--5,10)), (5,0--5,10), - { InKeyword = None }), [], (3,0--5,10), Yes (3,0--3,3), + { LetOrUseKeyword = (5,0--5,3) + InKeyword = None }), [], (3,0--5,10), Yes (3,0--3,3), Yes (5,10--5,10), { TryKeyword = (3,0--3,3) TryToWithRange = (3,0--5,10) WithKeyword = (5,10--5,10) diff --git a/tests/service/data/SyntaxTree/LeadingKeyword/UseKeyword.fs.bsl b/tests/service/data/SyntaxTree/LeadingKeyword/UseKeyword.fs.bsl index b2b3420c806..4571189344f 100644 --- a/tests/service/data/SyntaxTree/LeadingKeyword/UseKeyword.fs.bsl +++ b/tests/service/data/SyntaxTree/LeadingKeyword/UseKeyword.fs.bsl @@ -22,8 +22,9 @@ ImplFile { LeadingKeyword = Use (3,4--3,7) InlineKeyword = None EqualsRange = Some (3,10--3,11) })], - Const (Unit, (4,4--4,6)), (3,4--4,6), { InKeyword = None }), - (2,0--4,6)), (2,0--4,6))], PreXmlDocEmpty, [], None, (2,0--5,0), - { LeadingKeyword = None })], (true, true), - { ConditionalDirectives = [] - CodeComments = [] }, set [])) + Const (Unit, (4,4--4,6)), (3,4--4,6), + { LetOrUseKeyword = (3,4--3,7) + InKeyword = None }), (2,0--4,6)), (2,0--4,6))], + PreXmlDocEmpty, [], None, (2,0--5,0), { LeadingKeyword = None })], + (true, true), { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/LeadingKeyword/UseRecKeyword.fs.bsl b/tests/service/data/SyntaxTree/LeadingKeyword/UseRecKeyword.fs.bsl index 7dbbc35edd7..ac1d1ce9819 100644 --- a/tests/service/data/SyntaxTree/LeadingKeyword/UseRecKeyword.fs.bsl +++ b/tests/service/data/SyntaxTree/LeadingKeyword/UseRecKeyword.fs.bsl @@ -22,8 +22,9 @@ ImplFile { LeadingKeyword = UseRec ((3,4--3,7), (3,8--3,11)) InlineKeyword = None EqualsRange = Some (3,14--3,15) })], - Const (Unit, (4,4--4,6)), (3,4--4,6), { InKeyword = None }), - (2,0--4,6)), (2,0--4,6))], PreXmlDocEmpty, [], None, (2,0--5,0), - { LeadingKeyword = None })], (true, true), - { ConditionalDirectives = [] - CodeComments = [] }, set [])) + Const (Unit, (4,4--4,6)), (3,4--4,6), + { LetOrUseKeyword = (3,4--3,11) + InKeyword = None }), (2,0--4,6)), (2,0--4,6))], + PreXmlDocEmpty, [], None, (2,0--5,0), { LeadingKeyword = None })], + (true, true), { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/MatchClause/RangeOfMultipleSynMatchClause.fs.bsl b/tests/service/data/SyntaxTree/MatchClause/RangeOfMultipleSynMatchClause.fs.bsl index 84ce5019498..f4b3b9f7a39 100644 --- a/tests/service/data/SyntaxTree/MatchClause/RangeOfMultipleSynMatchClause.fs.bsl +++ b/tests/service/data/SyntaxTree/MatchClause/RangeOfMultipleSynMatchClause.fs.bsl @@ -25,7 +25,8 @@ ImplFile EqualsRange = Some (3,16--3,17) })], App (NonAtomic, false, Ident Some, Ident content, (4,4--4,16)), - (3,4--4,16), { InKeyword = None }), + (3,4--4,16), { LetOrUseKeyword = (3,4--3,7) + InKeyword = None }), [SynMatchClause (Named (SynIdent (ex, None), false, None, (6,2--6,4)), None, Sequential diff --git a/tests/service/data/SyntaxTree/MatchClause/RangeOfSingleSynMatchClause.fs.bsl b/tests/service/data/SyntaxTree/MatchClause/RangeOfSingleSynMatchClause.fs.bsl index dfa2ad58587..324463e7b2e 100644 --- a/tests/service/data/SyntaxTree/MatchClause/RangeOfSingleSynMatchClause.fs.bsl +++ b/tests/service/data/SyntaxTree/MatchClause/RangeOfSingleSynMatchClause.fs.bsl @@ -25,7 +25,8 @@ ImplFile EqualsRange = Some (3,16--3,17) })], App (NonAtomic, false, Ident Some, Ident content, (4,4--4,16)), - (3,4--4,16), { InKeyword = None }), + (3,4--4,16), { LetOrUseKeyword = (3,4--3,7) + InKeyword = None }), [SynMatchClause (Named (SynIdent (ex, None), false, None, (5,5--5,7)), None, Sequential diff --git a/tests/service/data/SyntaxTree/MatchClause/RangeOfSingleSynMatchClauseFollowedByBar.fs.bsl b/tests/service/data/SyntaxTree/MatchClause/RangeOfSingleSynMatchClauseFollowedByBar.fs.bsl index ea10cf70558..132cbd01cc0 100644 --- a/tests/service/data/SyntaxTree/MatchClause/RangeOfSingleSynMatchClauseFollowedByBar.fs.bsl +++ b/tests/service/data/SyntaxTree/MatchClause/RangeOfSingleSynMatchClauseFollowedByBar.fs.bsl @@ -25,7 +25,8 @@ ImplFile EqualsRange = Some (3,16--3,17) })], App (NonAtomic, false, Ident Some, Ident content, (4,4--4,16)), - (3,4--4,16), { InKeyword = None }), + (3,4--4,16), { LetOrUseKeyword = (3,4--3,7) + InKeyword = None }), [SynMatchClause (Named (SynIdent (ex, None), false, None, (6,2--6,4)), None, Const (Unit, (7,4--7,6)), (6,2--7,6), Yes, diff --git a/tests/service/data/SyntaxTree/Pattern/Typed - Missing type 05.fs.bsl b/tests/service/data/SyntaxTree/Pattern/Typed - Missing type 05.fs.bsl index 54749497087..7bd27b958c6 100644 --- a/tests/service/data/SyntaxTree/Pattern/Typed - Missing type 05.fs.bsl +++ b/tests/service/data/SyntaxTree/Pattern/Typed - Missing type 05.fs.bsl @@ -30,7 +30,8 @@ ImplFile InlineKeyword = None EqualsRange = None })], ArbitraryAfterError ("seqExpr", (4,10--4,10)), - (4,4--4,10), { InKeyword = None }), (4,4--4,10)), + (4,4--4,10), { LetOrUseKeyword = (4,4--4,7) + InKeyword = None }), (4,4--4,10)), (3,0--4,10)), (3,0--4,10))], PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, (1,0--4,10), { LeadingKeyword = Module (1,0--1,6) })], (true, true), diff --git a/tests/service/data/SyntaxTree/Pattern/Typed - Missing type 06.fs.bsl b/tests/service/data/SyntaxTree/Pattern/Typed - Missing type 06.fs.bsl index 55a07b60288..6120ff4f5fd 100644 --- a/tests/service/data/SyntaxTree/Pattern/Typed - Missing type 06.fs.bsl +++ b/tests/service/data/SyntaxTree/Pattern/Typed - Missing type 06.fs.bsl @@ -26,8 +26,9 @@ ImplFile { LeadingKeyword = Let (4,4--4,7) InlineKeyword = None EqualsRange = Some (4,11--4,12) })], - Const (Unit, (6,4--6,6)), (4,4--6,6), { InKeyword = None }), - (3,0--6,6)), (3,0--6,6))], + Const (Unit, (6,4--6,6)), (4,4--6,6), + { LetOrUseKeyword = (4,4--4,7) + InKeyword = None }), (3,0--6,6)), (3,0--6,6))], PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, (1,0--6,6), { LeadingKeyword = Module (1,0--1,6) })], (true, true), { ConditionalDirectives = [] diff --git a/tests/service/data/SyntaxTree/Pattern/Typed - Missing type 09.fs.bsl b/tests/service/data/SyntaxTree/Pattern/Typed - Missing type 09.fs.bsl index 89a4af5ce5c..0f2e4604d2b 100644 --- a/tests/service/data/SyntaxTree/Pattern/Typed - Missing type 09.fs.bsl +++ b/tests/service/data/SyntaxTree/Pattern/Typed - Missing type 09.fs.bsl @@ -25,7 +25,8 @@ ImplFile { LeadingKeyword = Let (4,4--4,7) InlineKeyword = None EqualsRange = None })], Const (Unit, (6,4--6,6)), - (4,4--6,6), { InKeyword = None }), (3,0--6,6)), (3,0--6,6))], + (4,4--6,6), { LetOrUseKeyword = (4,4--4,7) + InKeyword = None }), (3,0--6,6)), (3,0--6,6))], PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, (1,0--6,6), { LeadingKeyword = Module (1,0--1,6) })], (true, true), { ConditionalDirectives = [] diff --git a/tests/service/data/SyntaxTree/Pattern/Typed - Missing type 10.fs.bsl b/tests/service/data/SyntaxTree/Pattern/Typed - Missing type 10.fs.bsl index f3fa83db96a..5e8ab0f26fd 100644 --- a/tests/service/data/SyntaxTree/Pattern/Typed - Missing type 10.fs.bsl +++ b/tests/service/data/SyntaxTree/Pattern/Typed - Missing type 10.fs.bsl @@ -24,8 +24,9 @@ ImplFile { LeadingKeyword = Let (4,4--4,7) InlineKeyword = None EqualsRange = Some (4,13--4,14) })], - Const (Unit, (6,4--6,6)), (4,4--6,6), { InKeyword = None }), - (3,0--6,6)), (3,0--6,6))], + Const (Unit, (6,4--6,6)), (4,4--6,6), + { LetOrUseKeyword = (4,4--4,7) + InKeyword = None }), (3,0--6,6)), (3,0--6,6))], PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, (1,0--6,6), { LeadingKeyword = Module (1,0--1,6) })], (true, true), { ConditionalDirectives = [] diff --git a/tests/service/data/SyntaxTree/Pattern/Typed - Missing type 11.fs.bsl b/tests/service/data/SyntaxTree/Pattern/Typed - Missing type 11.fs.bsl index e89431a48e0..dbf43bcf3b1 100644 --- a/tests/service/data/SyntaxTree/Pattern/Typed - Missing type 11.fs.bsl +++ b/tests/service/data/SyntaxTree/Pattern/Typed - Missing type 11.fs.bsl @@ -30,8 +30,9 @@ ImplFile { LeadingKeyword = Let (4,4--4,7) InlineKeyword = None EqualsRange = Some (4,15--4,16) })], - Const (Unit, (6,4--6,6)), (4,4--6,6), { InKeyword = None }), - (3,0--6,6)), (3,0--6,6))], + Const (Unit, (6,4--6,6)), (4,4--6,6), + { LetOrUseKeyword = (4,4--4,7) + InKeyword = None }), (3,0--6,6)), (3,0--6,6))], PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, (1,0--6,6), { LeadingKeyword = Module (1,0--1,6) })], (true, true), { ConditionalDirectives = [] diff --git a/tests/service/data/SyntaxTree/Pattern/Typed - Missing type 12.fs.bsl b/tests/service/data/SyntaxTree/Pattern/Typed - Missing type 12.fs.bsl index 97ad7191e25..416dc67c859 100644 --- a/tests/service/data/SyntaxTree/Pattern/Typed - Missing type 12.fs.bsl +++ b/tests/service/data/SyntaxTree/Pattern/Typed - Missing type 12.fs.bsl @@ -38,8 +38,9 @@ ImplFile { LeadingKeyword = Let (4,4--4,7) InlineKeyword = None EqualsRange = Some (4,18--4,19) })], - Const (Unit, (6,4--6,6)), (4,4--6,6), { InKeyword = None }), - (3,0--6,6)), (3,0--6,6))], + Const (Unit, (6,4--6,6)), (4,4--6,6), + { LetOrUseKeyword = (4,4--4,7) + InKeyword = None }), (3,0--6,6)), (3,0--6,6))], PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, (1,0--6,6), { LeadingKeyword = Module (1,0--1,6) })], (true, true), { ConditionalDirectives = [] diff --git a/tests/service/data/SyntaxTree/String/InterpolatedStringOffsideInNestedLet.fs.bsl b/tests/service/data/SyntaxTree/String/InterpolatedStringOffsideInNestedLet.fs.bsl index d91bffd331d..1dfe5586b56 100644 --- a/tests/service/data/SyntaxTree/String/InterpolatedStringOffsideInNestedLet.fs.bsl +++ b/tests/service/data/SyntaxTree/String/InterpolatedStringOffsideInNestedLet.fs.bsl @@ -31,7 +31,8 @@ ImplFile { LeadingKeyword = Let (2,4--2,7) InlineKeyword = None EqualsRange = Some (2,10--2,11) })], Ident b, - (2,4--5,5), { InKeyword = None }), (1,4--1,5), NoneAtLet, + (2,4--5,5), { LetOrUseKeyword = (2,4--2,7) + InKeyword = None }), (1,4--1,5), NoneAtLet, { LeadingKeyword = Let (1,0--1,3) InlineKeyword = None EqualsRange = Some (1,6--1,7) })], (1,0--5,5))], From 162e1a0ac16ac067b532b37c5ae60759da371ee3 Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Fri, 27 Sep 2024 19:02:10 +0100 Subject: [PATCH 05/10] update baselines --- ...arp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl | 4 +++- ...p.Compiler.Service.SurfaceArea.netstandard20.release.bsl | 4 +++- .../NestedSynExprLetOrUseContainsTheRangeOfInKeyword.fs.bsl | 6 ++++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl index a53af559138..39400557e51 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl @@ -10217,7 +10217,9 @@ FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseTrivia: FSharp.Compiler.SyntaxTrivia FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] InKeyword FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_InKeyword() FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseTrivia: System.String ToString() -FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseTrivia: Void .ctor(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range]) +FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseTrivia: FSharp.Compiler.Text.Range LetOrUseKeyword +FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseTrivia: FSharp.Compiler.Text.Range get_LetOrUseKeyword() +FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseTrivia: Void .ctor(FSharp.Compiler.Text.Range, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range]) FSharp.Compiler.SyntaxTrivia.SynExprMatchBangTrivia: FSharp.Compiler.Text.Range MatchBangKeyword FSharp.Compiler.SyntaxTrivia.SynExprMatchBangTrivia: FSharp.Compiler.Text.Range WithKeyword FSharp.Compiler.SyntaxTrivia.SynExprMatchBangTrivia: FSharp.Compiler.Text.Range get_MatchBangKeyword() diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl index a53af559138..39400557e51 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl @@ -10217,7 +10217,9 @@ FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseTrivia: FSharp.Compiler.SyntaxTrivia FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] InKeyword FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseTrivia: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_InKeyword() FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseTrivia: System.String ToString() -FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseTrivia: Void .ctor(Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range]) +FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseTrivia: FSharp.Compiler.Text.Range LetOrUseKeyword +FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseTrivia: FSharp.Compiler.Text.Range get_LetOrUseKeyword() +FSharp.Compiler.SyntaxTrivia.SynExprLetOrUseTrivia: Void .ctor(FSharp.Compiler.Text.Range, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range]) FSharp.Compiler.SyntaxTrivia.SynExprMatchBangTrivia: FSharp.Compiler.Text.Range MatchBangKeyword FSharp.Compiler.SyntaxTrivia.SynExprMatchBangTrivia: FSharp.Compiler.Text.Range WithKeyword FSharp.Compiler.SyntaxTrivia.SynExprMatchBangTrivia: FSharp.Compiler.Text.Range get_MatchBangKeyword() diff --git a/tests/service/data/SyntaxTree/Expression/NestedSynExprLetOrUseContainsTheRangeOfInKeyword.fs.bsl b/tests/service/data/SyntaxTree/Expression/NestedSynExprLetOrUseContainsTheRangeOfInKeyword.fs.bsl index 132e7030303..791f6099b9e 100644 --- a/tests/service/data/SyntaxTree/Expression/NestedSynExprLetOrUseContainsTheRangeOfInKeyword.fs.bsl +++ b/tests/service/data/SyntaxTree/Expression/NestedSynExprLetOrUseContainsTheRangeOfInKeyword.fs.bsl @@ -55,8 +55,10 @@ ImplFile [Some (OriginalNotation "+")]), None, (5,6--5,7)), Ident x, (5,4--5,7)), Ident y, (5,4--5,9)), (4,4--5,9), - { InKeyword = Some (4,14--4,16) }), (3,4--5,9), - { InKeyword = Some (3,14--3,16) }), (2,4--2,8), NoneAtLet, + { LetOrUseKeyword = (4,4--4,7) + InKeyword = Some (4,14--4,16) }), (3,4--5,9), + { LetOrUseKeyword = (3,4--3,7) + InKeyword = Some (3,14--3,16) }), (2,4--2,8), NoneAtLet, { LeadingKeyword = Let (2,0--2,3) InlineKeyword = None EqualsRange = Some (2,9--2,10) })], (2,0--5,9))], From cf6c0bc3a43cf4c6eb3aed106890e75ba7c9ce7b Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Fri, 27 Sep 2024 22:23:04 +0100 Subject: [PATCH 06/10] more baselines --- tests/fsharp/typecheck/sigs/neg59.bsl | 12 ++++++------ tests/fsharp/typecheck/sigs/neg61.bsl | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/fsharp/typecheck/sigs/neg59.bsl b/tests/fsharp/typecheck/sigs/neg59.bsl index 624750b9352..c4f0ad604e7 100644 --- a/tests/fsharp/typecheck/sigs/neg59.bsl +++ b/tests/fsharp/typecheck/sigs/neg59.bsl @@ -9,13 +9,13 @@ neg59.fs(15,13,15,22): typecheck error FS3096: 'groupJoin' must be followed by a neg59.fs(15,44,15,45): typecheck error FS0039: The value or constructor 'j' is not defined. -neg59.fs(25,23,25,40): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. +neg59.fs(25,15,25,18): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. -neg59.fs(31,23,31,24): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. +neg59.fs(31,15,31,18): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. -neg59.fs(36,23,36,40): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. +neg59.fs(36,15,36,18): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. -neg59.fs(42,23,42,24): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. +neg59.fs(42,15,42,18): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. neg59.fs(49,15,49,27): typecheck error FS3090: An if/then/else expression may not be used within queries. Consider using either an if/then expression, or use a sequence expression instead. @@ -41,6 +41,6 @@ neg59.fs(113,15,113,25): typecheck error FS3140: 'while' expressions may not be neg59.fs(118,15,118,25): typecheck error FS3140: 'while' expressions may not be used in queries -neg59.fs(124,17,124,25): typecheck error FS3144: 'return' and 'return!' may not be used in queries +neg59.fs(124,17,124,23): typecheck error FS3144: 'return' and 'return!' may not be used in queries -neg59.fs(128,17,128,26): typecheck error FS3144: 'return' and 'return!' may not be used in queries +neg59.fs(128,17,128,24): typecheck error FS3144: 'return' and 'return!' may not be used in queries diff --git a/tests/fsharp/typecheck/sigs/neg61.bsl b/tests/fsharp/typecheck/sigs/neg61.bsl index 014af35d598..90883a7fbd5 100644 --- a/tests/fsharp/typecheck/sigs/neg61.bsl +++ b/tests/fsharp/typecheck/sigs/neg61.bsl @@ -71,13 +71,13 @@ neg61.fs(114,13,114,21): typecheck error FS3145: This is not a known query opera neg61.fs(114,22,114,23): typecheck error FS0001: The type 'int' does not support the operator 'truncate' -neg61.fs(133,17,133,20): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. +neg61.fs(133,9,133,12): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. -neg61.fs(140,17,140,20): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. +neg61.fs(140,9,140,12): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. -neg61.fs(148,20,148,23): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. +neg61.fs(148,9,148,12): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. -neg61.fs(156,21,156,22): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. +neg61.fs(156,9,156,12): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. neg61.fs(171,13,171,18): typecheck error FS3099: 'sumBy' is used with an incorrect number of arguments. This is a custom operation in this query or computation expression. Expected 1 argument(s), but given 0. From 2580c63a254651742fff106ce334add5bfa09a7c Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Fri, 27 Sep 2024 22:23:04 +0100 Subject: [PATCH 07/10] more baselines --- tests/fsharp/typecheck/sigs/neg59.bsl | 16 ++++++++-------- tests/fsharp/typecheck/sigs/neg61.bsl | 8 ++++---- .../ComputationExpressions/E_MissingUsing.fs | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/tests/fsharp/typecheck/sigs/neg59.bsl b/tests/fsharp/typecheck/sigs/neg59.bsl index 624750b9352..add69fb9733 100644 --- a/tests/fsharp/typecheck/sigs/neg59.bsl +++ b/tests/fsharp/typecheck/sigs/neg59.bsl @@ -9,13 +9,13 @@ neg59.fs(15,13,15,22): typecheck error FS3096: 'groupJoin' must be followed by a neg59.fs(15,44,15,45): typecheck error FS0039: The value or constructor 'j' is not defined. -neg59.fs(25,23,25,40): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. +neg59.fs(25,15,25,18): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. -neg59.fs(31,23,31,24): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. +neg59.fs(31,15,31,18): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. -neg59.fs(36,23,36,40): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. +neg59.fs(36,15,36,18): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. -neg59.fs(42,23,42,24): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. +neg59.fs(42,15,42,18): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. neg59.fs(49,15,49,27): typecheck error FS3090: An if/then/else expression may not be used within queries. Consider using either an if/then expression, or use a sequence expression instead. @@ -33,14 +33,14 @@ neg59.fs(89,15,89,18): typecheck error FS3141: 'try/finally' expressions may not neg59.fs(95,15,95,18): typecheck error FS3141: 'try/finally' expressions may not be used in queries -neg59.fs(102,15,102,64): typecheck error FS3142: 'use' expressions may not be used in queries +neg59.fs(102,15,102,18): typecheck error FS3142: 'use' expressions may not be used in queries -neg59.fs(108,15,108,64): typecheck error FS3142: 'use' expressions may not be used in queries +neg59.fs(108,15,108,18): typecheck error FS3142: 'use' expressions may not be used in queries neg59.fs(113,15,113,25): typecheck error FS3140: 'while' expressions may not be used in queries neg59.fs(118,15,118,25): typecheck error FS3140: 'while' expressions may not be used in queries -neg59.fs(124,17,124,25): typecheck error FS3144: 'return' and 'return!' may not be used in queries +neg59.fs(124,17,124,23): typecheck error FS3144: 'return' and 'return!' may not be used in queries -neg59.fs(128,17,128,26): typecheck error FS3144: 'return' and 'return!' may not be used in queries +neg59.fs(128,17,128,24): typecheck error FS3144: 'return' and 'return!' may not be used in queries diff --git a/tests/fsharp/typecheck/sigs/neg61.bsl b/tests/fsharp/typecheck/sigs/neg61.bsl index 014af35d598..90883a7fbd5 100644 --- a/tests/fsharp/typecheck/sigs/neg61.bsl +++ b/tests/fsharp/typecheck/sigs/neg61.bsl @@ -71,13 +71,13 @@ neg61.fs(114,13,114,21): typecheck error FS3145: This is not a known query opera neg61.fs(114,22,114,23): typecheck error FS0001: The type 'int' does not support the operator 'truncate' -neg61.fs(133,17,133,20): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. +neg61.fs(133,9,133,12): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. -neg61.fs(140,17,140,20): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. +neg61.fs(140,9,140,12): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. -neg61.fs(148,20,148,23): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. +neg61.fs(148,9,148,12): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. -neg61.fs(156,21,156,22): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. +neg61.fs(156,9,156,12): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. neg61.fs(171,13,171,18): typecheck error FS3099: 'sumBy' is used with an incorrect number of arguments. This is a custom operation in this query or computation expression. Expected 1 argument(s), but given 0. diff --git a/tests/fsharpqa/Source/Conformance/Expressions/DataExpressions/ComputationExpressions/E_MissingUsing.fs b/tests/fsharpqa/Source/Conformance/Expressions/DataExpressions/ComputationExpressions/E_MissingUsing.fs index 90018a3a6a5..e83604cfdf9 100644 --- a/tests/fsharpqa/Source/Conformance/Expressions/DataExpressions/ComputationExpressions/E_MissingUsing.fs +++ b/tests/fsharpqa/Source/Conformance/Expressions/DataExpressions/ComputationExpressions/E_MissingUsing.fs @@ -1,6 +1,6 @@ // #Regression #Conformance #DataExpressions #ComputationExpressions // Regression test for FSHARP1.0:6149 -//This control construct may only be used if the computation expression builder defines a 'Using' method$ +//This control construct may only be used if the computation expression builder defines a 'Using' method$ type R = S of string From 4ae2db0b1bc42661728d3bc3e9eec8a84f949869 Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Sat, 28 Sep 2024 15:47:58 +0100 Subject: [PATCH 08/10] update tests --- tests/fsharp/typecheck/sigs/neg59.bsl | 12 ++++++------ tests/fsharp/typecheck/sigs/neg61.bsl | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/tests/fsharp/typecheck/sigs/neg59.bsl b/tests/fsharp/typecheck/sigs/neg59.bsl index add69fb9733..af44351fb48 100644 --- a/tests/fsharp/typecheck/sigs/neg59.bsl +++ b/tests/fsharp/typecheck/sigs/neg59.bsl @@ -9,13 +9,13 @@ neg59.fs(15,13,15,22): typecheck error FS3096: 'groupJoin' must be followed by a neg59.fs(15,44,15,45): typecheck error FS0039: The value or constructor 'j' is not defined. -neg59.fs(25,15,25,18): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. +neg59.fs(25,23,25,40): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. -neg59.fs(31,15,31,18): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. +neg59.fs(31,23,31,24): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. -neg59.fs(36,15,36,18): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. +neg59.fs(36,23,36,40): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. -neg59.fs(42,15,42,18): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. +neg59.fs(42,23,42,24): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. neg59.fs(49,15,49,27): typecheck error FS3090: An if/then/else expression may not be used within queries. Consider using either an if/then expression, or use a sequence expression instead. @@ -41,6 +41,6 @@ neg59.fs(113,15,113,25): typecheck error FS3140: 'while' expressions may not be neg59.fs(118,15,118,25): typecheck error FS3140: 'while' expressions may not be used in queries -neg59.fs(124,17,124,23): typecheck error FS3144: 'return' and 'return!' may not be used in queries +neg59.fs(124,17,124,25): typecheck error FS3144: 'return' and 'return!' may not be used in queries -neg59.fs(128,17,128,24): typecheck error FS3144: 'return' and 'return!' may not be used in queries +neg59.fs(128,17,128,26): typecheck error FS3144: 'return' and 'return!' may not be used in queries diff --git a/tests/fsharp/typecheck/sigs/neg61.bsl b/tests/fsharp/typecheck/sigs/neg61.bsl index 90883a7fbd5..db742f6a841 100644 --- a/tests/fsharp/typecheck/sigs/neg61.bsl +++ b/tests/fsharp/typecheck/sigs/neg61.bsl @@ -57,7 +57,7 @@ neg61.fs(79,13,79,16): typecheck error FS3146: 'try/with' expressions may not be neg61.fs(86,13,86,16): typecheck error FS3141: 'try/finally' expressions may not be used in queries -neg61.fs(92,13,92,15): typecheck error FS3142: 'use' expressions may not be used in queries +neg61.fs(92,13,92,16): typecheck error FS3142: 'use' expressions may not be used in queries neg61.fs(97,13,97,17): typecheck error FS3143: 'let!', 'use!' and 'do!' expressions may not be used in queries @@ -71,13 +71,13 @@ neg61.fs(114,13,114,21): typecheck error FS3145: This is not a known query opera neg61.fs(114,22,114,23): typecheck error FS0001: The type 'int' does not support the operator 'truncate' -neg61.fs(133,9,133,12): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. +neg61.fs(133,17,133,20): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. -neg61.fs(140,9,140,12): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. +neg61.fs(140,17,140,20): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. -neg61.fs(148,9,148,12): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. +neg61.fs(148,20,148,23): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. -neg61.fs(156,9,156,12): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. +neg61.fs(156,21,156,22): typecheck error FS3147: This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. neg61.fs(171,13,171,18): typecheck error FS3099: 'sumBy' is used with an incorrect number of arguments. This is a custom operation in this query or computation expression. Expected 1 argument(s), but given 0. From 680c654027c0ef28cdac2f5187253dffe2cb4cec Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Mon, 30 Sep 2024 20:17:50 +0100 Subject: [PATCH 09/10] more tests --- .../Language/ComputationExpressionTests.fs | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs b/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs index 0e84d0144ac..806320b20c6 100644 --- a/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs +++ b/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs @@ -541,4 +541,37 @@ let run r2 r3 = |> withDiagnostics [ (Error 708, Line 20, Col 9, Line 20, Col 12, "This control construct may only be used if the computation expression builder defines a 'Using' method") ] - \ No newline at end of file + + [] + let ``This 'let' definition may not be used in a query. Only simple value definitions may be used in queries.`` () = + Fsx """ +let x18rec2 = + query { + for d in [1..10] do + let rec f x = x + 1 // error expected here - no recursive functions + and g x = f x + 2 + select (f d) + } + +let x18inline = + query { + for d in [1..10] do + let inline f x = x + 1 // error expected here - no inline functions + select (f d) + } + +let x18mutable = + query { + for d in [1..10] do + let mutable v = 1 // error expected here - no mutable values + select (f d) + } + + """ + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Error 3147, Line 5, Col 17, Line 5, Col 20, "This 'let' definition may not be used in a query. Only simple value definitions may be used in queries.") + (Error 3147, Line 13, Col 20, Line 13, Col 23, "This 'let' definition may not be used in a query. Only simple value definitions may be used in queries.") + (Error 3147, Line 20, Col 21, Line 20, Col 22, "This 'let' definition may not be used in a query. Only simple value definitions may be used in queries.") + ] From dc30e69926bc8db8cb3f855e119aea4b82d535d7 Mon Sep 17 00:00:00 2001 From: Edgar Gonzalez Date: Tue, 8 Oct 2024 12:58:33 +0100 Subject: [PATCH 10/10] fix merge conflict --- .../Language/ComputationExpressionTests.fs | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs b/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs index 78de4d674f9..3555e97fd2d 100644 --- a/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs +++ b/tests/FSharp.Compiler.ComponentTests/Language/ComputationExpressionTests.fs @@ -645,3 +645,84 @@ let indexHandler (): Task = but here has type 'Task' ") ] + + [] + let ``use expressions may not be used in queries(SynExpr.Sequential)`` () = + Fsx """ +let x11 = + query { for c in [1..10] do + use x = { new System.IDisposable with __.Dispose() = () } + yield 1 } + """ + |> ignoreWarnings + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Error 3142, Line 4, Col 13, Line 4, Col 16, "'use' expressions may not be used in queries") + ] + + [] + let ``use, This control construct may only be used if the computation expression builder defines a 'Using' method`` () = + 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 _.YieldReturn(x: Result<'T,'U>) = x + member _.Return(x: 'T) = Ok x + +let result = ResultBuilder() + +let run r2 r3 = + result { + use b = r2 + return Ok 0 + } + """ + |> ignoreWarnings + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Error 708, Line 20, Col 9, Line 20, Col 12, "This control construct may only be used if the computation expression builder defines a 'Using' method") + ] + + [] + let ``This 'let' definition may not be used in a query. Only simple value definitions may be used in queries.`` () = + Fsx """ +let x18rec2 = + query { + for d in [1..10] do + let rec f x = x + 1 // error expected here - no recursive functions + and g x = f x + 2 + select (f d) + } + +let x18inline = + query { + for d in [1..10] do + let inline f x = x + 1 // error expected here - no inline functions + select (f d) + } + +let x18mutable = + query { + for d in [1..10] do + let mutable v = 1 // error expected here - no mutable values + select (f d) + } + + """ + |> typecheck + |> shouldFail + |> withDiagnostics [ + (Error 3147, Line 5, Col 17, Line 5, Col 20, "This 'let' definition may not be used in a query. Only simple value definitions may be used in queries.") + (Error 3147, Line 13, Col 20, Line 13, Col 23, "This 'let' definition may not be used in a query. Only simple value definitions may be used in queries.") + (Error 3147, Line 20, Col 21, Line 20, Col 22, "This 'let' definition may not be used in a query. Only simple value definitions may be used in queries.") + ] \ No newline at end of file