4242
4343module internal FSharp.Compiler.ConstraintSolver
4444
45+ open FSharp.Compiler .Text .Range
4546open Internal.Utilities .Collections
4647open Internal.Utilities .Library
4748open 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
772773let 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 =
16201621and 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