Skip to content

Commit 0a25074

Browse files
committed
Merge branch 'main' of https://github.com/dotnet/fsharp into fix17797
2 parents 5ebaeee + b204f87 commit 0a25074

File tree

70 files changed

+759
-352
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

70 files changed

+759
-352
lines changed

azure-pipelines.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ variables:
2929
# Should be 'current' release branch name, i.e. 'release/dev17.10' in dotnet/fsharp/refs/heads/main, 'release/dev17.10' in dotnet/fsharp/refs/heads/release/dev17.10 and 'release/dev17.9' in dotnet/fsharp/refs/heads/release/dev17.9
3030
# Should **never** be 'main' in dotnet/fsharp/refs/heads/main, since it will start inserting to VS twice.
3131
- name: FSharpReleaseBranchName
32-
value: release/dev17.13
32+
value: release/dev17.14
3333
# VS Insertion branch name (NOT the same as F# branch)
3434
# Should be previous release branch or 'main' in 'main' and 'main' in release branch
3535
# (since for all *new* release branches we insert into VS main and for all *previous* releases we insert into corresponding VS release),
@@ -88,7 +88,7 @@ extends:
8888
# Signed build #
8989
#-------------------------------------------------------------------------------------------------------------------#
9090
# Localization: we only run it for specific release branches
91-
- ${{ if eq(variables['Build.SourceBranch'], 'refs/heads/release/dev17.13') }}:
91+
- ${{ if eq(variables['Build.SourceBranch'], 'refs/heads/release/dev17.14') }}:
9292
- template: /eng/common/templates-official/job/onelocbuild.yml@self
9393
parameters:
9494
MirrorRepo: fsharp

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

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
* Completion: fix qualified completion in sequence expressions [PR #18111](https://github.com/dotnet/fsharp/pull/18111)
2323
* Symbols: try to use ValReprInfoForDisplay in Mfv.CurriedParameterGroups ([PR #18124](https://github.com/dotnet/fsharp/pull/18124))
2424
* Shim/file system: fix leaks of the shim [PR #18144](https://github.com/dotnet/fsharp/pull/18144)
25+
* Fix for `Obsolete` attribute warning/error not taken into account when used with a unit of measure [PR #18182](https://github.com/dotnet/fsharp/pull/18182)
2526

2627
### Added
2728

eng/Versions.props

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<!-- F# Version components -->
1515
<FSMajorVersion>9</FSMajorVersion>
1616
<FSMinorVersion>0</FSMinorVersion>
17-
<FSBuildVersion>200</FSBuildVersion>
17+
<FSBuildVersion>300</FSBuildVersion>
1818
<FSRevisionVersion>0</FSRevisionVersion>
1919
<!-- -->
2020
<!-- F# Language version -->
@@ -53,7 +53,7 @@
5353
<PropertyGroup>
5454
<!-- These have to be in sync with latest release branch -->
5555
<VSMajorVersion>17</VSMajorVersion>
56-
<VSMinorVersion>13</VSMinorVersion>
56+
<VSMinorVersion>14</VSMinorVersion>
5757
<VSGeneralVersion>$(VSMajorVersion).0</VSGeneralVersion>
5858
<VSAssemblyVersionPrefix>$(VSMajorVersion).$(VSMinorVersion).0</VSAssemblyVersionPrefix>
5959
<VSAssemblyVersion>$(VSAssemblyVersionPrefix).0</VSAssemblyVersion>

src/Compiler/Checking/AttributeChecking.fs

+21-1
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,27 @@ let CheckEntityAttributes g (tcref: TyconRef) m =
417417
CheckFSharpAttributes g tcref.Attribs m
418418

419419
let CheckILEventAttributes g (tcref: TyconRef) cattrs m =
420-
CheckILAttributes g (isByrefLikeTyconRef g m tcref) cattrs m
420+
CheckILAttributes g (isByrefLikeTyconRef g m tcref) cattrs m
421+
422+
let CheckUnitOfMeasureAttributes g (measure: Measure) =
423+
let checkAttribs tm m =
424+
let attribs =
425+
ListMeasureConOccsWithNonZeroExponents g true tm
426+
|> List.map fst
427+
|> List.map(_.Attribs)
428+
|> List.concat
429+
430+
CheckFSharpAttributes g attribs m |> CommitOperationResult
431+
432+
match measure with
433+
| Measure.Const(range = m) -> checkAttribs measure m
434+
| Measure.Inv ms -> checkAttribs measure ms.Range
435+
| Measure.One(m) -> checkAttribs measure m
436+
| Measure.RationalPower(measure = ms1) -> checkAttribs measure ms1.Range
437+
| Measure.Prod(measure1= ms1; measure2= ms2) ->
438+
checkAttribs ms1 ms1.Range
439+
checkAttribs ms2 ms2.Range
440+
| Measure.Var(typar) -> checkAttribs measure typar.Range
421441

422442
/// Check the attributes associated with a method, returning warnings and errors as data.
423443
let CheckMethInfoAttributes g m tyargsOpt (minfo: MethInfo) =

src/Compiler/Checking/AttributeChecking.fsi

+2
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ val CheckEntityAttributes: g: TcGlobals -> tcref: TyconRef -> m: range -> Operat
8989

9090
val CheckUnionCaseAttributes: g: TcGlobals -> x: UnionCaseRef -> m: range -> OperationResult<unit>
9191

92+
val CheckUnitOfMeasureAttributes: g: TcGlobals -> measure: Measure -> unit
93+
9294
val CheckRecdFieldAttributes: g: TcGlobals -> x: RecdFieldRef -> m: range -> OperationResult<unit>
9395

9496
val CheckValAttributes: g: TcGlobals -> x: ValRef -> m: range -> OperationResult<unit>

src/Compiler/Checking/CheckDeclarations.fs

+10-3
Original file line numberDiff line numberDiff line change
@@ -3241,6 +3241,13 @@ module EstablishTypeDefinitionCores =
32413241
warning(Error(FSComp.SR.chkAttributeAliased(attrib.TypeRef.FullName), tycon.Id.idRange))
32423242
| _ -> ()
32433243

3244+
// Check for attributes in unit-of-measure declarations
3245+
// [<Measure>] type x = 1<s>
3246+
// ^
3247+
match stripTyEqns g ty with
3248+
| TType_measure tm -> CheckUnitOfMeasureAttributes g tm
3249+
| _ -> ()
3250+
32443251
checkAttributeAliased ty tycon g.attrib_AutoOpenAttribute
32453252
checkAttributeAliased ty tycon g.attrib_StructAttribute
32463253

@@ -3807,11 +3814,11 @@ module EstablishTypeDefinitionCores =
38073814

38083815
and accInMeasure measureTy acc =
38093816
match stripUnitEqns measureTy with
3810-
| Measure.Const tcref when ListSet.contains (===) tcref.Deref tycons ->
3817+
| Measure.Const(tyconRef= tcref) when ListSet.contains (===) tcref.Deref tycons ->
38113818
(tycon, tcref.Deref) :: acc
3812-
| Measure.Const tcref when tcref.IsTypeAbbrev ->
3819+
| Measure.Const(tyconRef= tcref) when tcref.IsTypeAbbrev ->
38133820
accInMeasure (reduceTyconRefAbbrevMeasureable tcref) acc
3814-
| Measure.Prod (ms1, ms2) -> accInMeasure ms1 (accInMeasure ms2 acc)
3821+
| Measure.Prod(measure1= ms1; measure2= ms2) -> accInMeasure ms1 (accInMeasure ms2 acc)
38153822
| Measure.Inv invTy -> accInMeasure invTy acc
38163823
| _ -> acc
38173824

src/Compiler/Checking/CheckPatterns.fs

+1-1
Original file line numberDiff line numberDiff line change
@@ -803,7 +803,7 @@ and TcPatLongIdentLiteral warnOnUpper (cenv: cenv) env vFlags patEnv ty (mLongId
803803
match vref.LiteralValue with
804804
| None -> error (Error(FSComp.SR.tcNonLiteralCannotBeUsedInPattern(), m))
805805
| Some lit ->
806-
let _, _, _, vexpty, _, _ = TcVal true cenv env tpenv vref None None mLongId
806+
let _, _, _, vexpty, _, _ = TcVal cenv env tpenv vref None None mLongId
807807
CheckValAccessible mLongId env.AccessRights vref
808808
CheckFSharpAttributes g vref.Attribs mLongId |> CommitOperationResult
809809
CheckNoArgsForLiteral args m

src/Compiler/Checking/ConstraintSolver.fs

+15-14
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242

4343
module internal FSharp.Compiler.ConstraintSolver
4444

45+
open FSharp.Compiler.Text.Range
4546
open Internal.Utilities.Collections
4647
open Internal.Utilities.Library
4748
open Internal.Utilities.Library.Extras
@@ -734,7 +735,7 @@ let SubstMeasureWarnIfRigid (csenv: ConstraintSolverEnv) trace (v: Typar) ms =
734735
// Propagate static requirements from 'tp' to 'ty'
735736
do! SolveTypStaticReq csenv trace v.StaticReq (TType_measure ms)
736737
SubstMeasure v ms
737-
if v.Rigidity = TyparRigidity.Anon && measureEquiv csenv.g ms Measure.One then
738+
if v.Rigidity = TyparRigidity.Anon && measureEquiv csenv.g ms (Measure.One ms.Range) then
738739
return! WarnD(Error(FSComp.SR.csCodeLessGeneric(), v.Range))
739740
else
740741
()
@@ -760,17 +761,17 @@ let UnifyMeasureWithOne (csenv: ConstraintSolverEnv) trace ms =
760761
match FindPreferredTypar nonRigidVars with
761762
| (v, e) :: vs ->
762763
let unexpandedCons = ListMeasureConOccsWithNonZeroExponents csenv.g false ms
763-
let newms = ProdMeasures (List.map (fun (c, e') -> Measure.RationalPower (Measure.Const c, NegRational (DivRational e' e))) unexpandedCons
764+
let newms = ProdMeasures (List.map (fun (c, e') -> Measure.RationalPower(Measure.Const(c, ms.Range), NegRational (DivRational e' e))) unexpandedCons
764765
@ List.map (fun (v, e') -> Measure.RationalPower (Measure.Var v, NegRational (DivRational e' e))) (vs @ rigidVars))
765766

766767
SubstMeasureWarnIfRigid csenv trace v newms
767768

768769
// Otherwise we require ms to be 1
769-
| [] -> if measureEquiv csenv.g ms Measure.One then CompleteD else localAbortD
770+
| [] -> if measureEquiv csenv.g ms (Measure.One ms.Range) then CompleteD else localAbortD
770771

771772
/// Imperatively unify unit-of-measure expression ms1 against ms2
772773
let UnifyMeasures (csenv: ConstraintSolverEnv) trace ms1 ms2 =
773-
UnifyMeasureWithOne csenv trace (Measure.Prod(ms1, Measure.Inv ms2))
774+
UnifyMeasureWithOne csenv trace (Measure.Prod(ms1, Measure.Inv ms2, (unionRanges ms1.Range ms2.Range)))
774775

775776
/// Simplify a unit-of-measure expression ms that forms part of a type scheme.
776777
/// We make substitutions for vars, which are the (remaining) bound variables
@@ -791,7 +792,7 @@ let SimplifyMeasure g vars ms =
791792
let newms =
792793
ProdMeasures [
793794
for (c, e') in nonZeroCon do
794-
Measure.RationalPower (Measure.Const c, NegRational (DivRational e' e))
795+
Measure.RationalPower (Measure.Const(c, ms.Range), NegRational (DivRational e' e))
795796
for (v', e') in nonZeroVar do
796797
if typarEq v v' then
797798
newvarExpr
@@ -1329,13 +1330,13 @@ and SolveTypeEqualsType (csenv: ConstraintSolverEnv) ndeep m2 (trace: OptionalTr
13291330
// Catch float<_>=float<1>, float32<_>=float32<1> and decimal<_>=decimal<1>
13301331
| (_, TType_app (tc2, [ms2], _)) when (tc2.IsMeasureableReprTycon && typeEquiv csenv.g sty1 (reduceTyconRefMeasureableOrProvided csenv.g tc2 [ms2])) ->
13311332
trackErrors {
1332-
do! SolveTypeEqualsType csenv ndeep m2 trace None (TType_measure Measure.One) ms2
1333+
do! SolveTypeEqualsType csenv ndeep m2 trace None (TType_measure(Measure.One m2)) ms2
13331334
do! SolveNullnessEquiv csenv m2 trace ty1 ty2 (nullnessOfTy g sty1) (nullnessOfTy g sty2)
13341335
}
13351336

13361337
| (TType_app (tc1, [ms1], _), _) when (tc1.IsMeasureableReprTycon && typeEquiv csenv.g sty2 (reduceTyconRefMeasureableOrProvided csenv.g tc1 [ms1])) ->
13371338
trackErrors {
1338-
do! SolveTypeEqualsType csenv ndeep m2 trace None ms1 (TType_measure Measure.One)
1339+
do! SolveTypeEqualsType csenv ndeep m2 trace None ms1 (TType_measure(Measure.One m2))
13391340
do! SolveNullnessEquiv csenv m2 trace ty1 ty2 (nullnessOfTy g sty1) (nullnessOfTy g sty2)
13401341
}
13411342

@@ -1518,13 +1519,13 @@ and SolveTypeSubsumesType (csenv: ConstraintSolverEnv) ndeep m2 (trace: Optional
15181519
// Enforce the identities float=float<1>, float32=float32<1> and decimal=decimal<1>
15191520
| _, TType_app (tc2, [ms2], _) when tc2.IsMeasureableReprTycon && typeEquiv csenv.g sty1 (reduceTyconRefMeasureableOrProvided csenv.g tc2 [ms2]) ->
15201521
trackErrors {
1521-
do! SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln ms2 (TType_measure Measure.One)
1522+
do! SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln ms2 (TType_measure(Measure.One m2))
15221523
do! SolveNullnessSubsumesNullness csenv m2 trace ty1 ty2 (nullnessOfTy g sty1) (nullnessOfTy g sty2)
15231524
}
15241525

15251526
| TType_app (tc1, [ms1], _), _ when tc1.IsMeasureableReprTycon && typeEquiv csenv.g sty2 (reduceTyconRefMeasureableOrProvided csenv.g tc1 [ms1]) ->
15261527
trackErrors {
1527-
do! SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln ms1 (TType_measure Measure.One)
1528+
do! SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln ms1 (TType_measure(Measure.One m2))
15281529
do! SolveNullnessSubsumesNullness csenv m2 trace ty1 ty2 (nullnessOfTy g sty1) (nullnessOfTy g sty2)
15291530
}
15301531

@@ -1620,7 +1621,7 @@ and DepthCheck ndeep m =
16201621
and SolveDimensionlessNumericType (csenv: ConstraintSolverEnv) ndeep m2 trace ty =
16211622
match getMeasureOfType csenv.g ty with
16221623
| Some (tcref, _) ->
1623-
SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace ty (mkWoNullAppTy tcref [TType_measure Measure.One])
1624+
SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace ty (mkWoNullAppTy tcref [TType_measure(Measure.One m2)])
16241625
| None ->
16251626
CompleteD
16261627

@@ -1727,7 +1728,7 @@ and SolveMemberConstraint (csenv: ConstraintSolverEnv) ignoreUnresolvedOverload
17271728
| Some (tcref, ms1) ->
17281729
let ms2 = freshMeasure ()
17291730
do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 (mkWoNullAppTy tcref [TType_measure ms2])
1730-
do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy (mkWoNullAppTy tcref [TType_measure (Measure.Prod(ms1, if nm = "op_Multiply" then ms2 else Measure.Inv ms2))])
1731+
do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy (mkWoNullAppTy tcref [TType_measure (Measure.Prod(ms1, (if nm = "op_Multiply" then ms2 else Measure.Inv ms2), unionRanges ms1.Range ms2.Range))])
17311732
return TTraitBuiltIn
17321733

17331734
| _ ->
@@ -1736,7 +1737,7 @@ and SolveMemberConstraint (csenv: ConstraintSolverEnv) ignoreUnresolvedOverload
17361737
| Some (tcref, ms2) ->
17371738
let ms1 = freshMeasure ()
17381739
do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy1 (mkWoNullAppTy tcref [TType_measure ms1])
1739-
do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy (mkWoNullAppTy tcref [TType_measure (Measure.Prod(ms1, if nm = "op_Multiply" then ms2 else Measure.Inv ms2))])
1740+
do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy (mkWoNullAppTy tcref [TType_measure (Measure.Prod(ms1, (if nm = "op_Multiply" then ms2 else Measure.Inv ms2), unionRanges ms1.Range ms2.Range))])
17401741
return TTraitBuiltIn
17411742

17421743
| _ ->
@@ -1870,7 +1871,7 @@ and SolveMemberConstraint (csenv: ConstraintSolverEnv) ignoreUnresolvedOverload
18701871
match getMeasureOfType g argTy1 with
18711872
| Some (tcref, _) ->
18721873
let ms1 = freshMeasure ()
1873-
do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy1 (mkWoNullAppTy tcref [TType_measure (Measure.Prod (ms1, ms1))])
1874+
do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy1 (mkWoNullAppTy tcref [TType_measure (Measure.Prod (ms1, ms1, ms1.Range))])
18741875
do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy (mkWoNullAppTy tcref [TType_measure ms1])
18751876
return TTraitBuiltIn
18761877
| None ->
@@ -1923,7 +1924,7 @@ and SolveMemberConstraint (csenv: ConstraintSolverEnv) ignoreUnresolvedOverload
19231924
do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 argTy1
19241925
match getMeasureOfType g argTy1 with
19251926
| None -> do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy argTy1
1926-
| Some (tcref, _) -> do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy (mkWoNullAppTy tcref [TType_measure Measure.One])
1927+
| Some (tcref, ms) -> do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy (mkWoNullAppTy tcref [TType_measure(Measure.One ms.Range)])
19271928
return TTraitBuiltIn
19281929

19291930
| _ ->

0 commit comments

Comments
 (0)