42
42
43
43
module internal FSharp.Compiler.ConstraintSolver
44
44
45
+ open FSharp.Compiler .Text .Range
45
46
open Internal.Utilities .Collections
46
47
open Internal.Utilities .Library
47
48
open Internal.Utilities .Library .Extras
@@ -734,7 +735,7 @@ let SubstMeasureWarnIfRigid (csenv: ConstraintSolverEnv) trace (v: Typar) ms =
734
735
// Propagate static requirements from 'tp' to 'ty'
735
736
do ! SolveTypStaticReq csenv trace v.StaticReq ( TType_ measure ms)
736
737
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
738
739
return ! WarnD( Error( FSComp.SR.csCodeLessGeneric(), v.Range))
739
740
else
740
741
()
@@ -760,17 +761,17 @@ let UnifyMeasureWithOne (csenv: ConstraintSolverEnv) trace ms =
760
761
match FindPreferredTypar nonRigidVars with
761
762
| ( v, e) :: vs ->
762
763
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
764
765
@ List.map ( fun ( v , e' ) -> Measure.RationalPower ( Measure.Var v, NegRational ( DivRational e' e))) ( vs @ rigidVars))
765
766
766
767
SubstMeasureWarnIfRigid csenv trace v newms
767
768
768
769
// 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
770
771
771
772
/// Imperatively unify unit-of-measure expression ms1 against ms2
772
773
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 ) ))
774
775
775
776
/// Simplify a unit-of-measure expression ms that forms part of a type scheme.
776
777
/// We make substitutions for vars, which are the (remaining) bound variables
@@ -791,7 +792,7 @@ let SimplifyMeasure g vars ms =
791
792
let newms =
792
793
ProdMeasures [
793
794
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))
795
796
for ( v', e') in nonZeroVar do
796
797
if typarEq v v' then
797
798
newvarExpr
@@ -1329,13 +1330,13 @@ and SolveTypeEqualsType (csenv: ConstraintSolverEnv) ndeep m2 (trace: OptionalTr
1329
1330
// Catch float<_>=float<1>, float32<_>=float32<1> and decimal<_>=decimal<1>
1330
1331
| (_, TType_ app ( tc2, [ ms2], _)) when ( tc2.IsMeasureableReprTycon && typeEquiv csenv.g sty1 ( reduceTyconRefMeasureableOrProvided csenv.g tc2 [ ms2])) ->
1331
1332
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
1333
1334
do ! SolveNullnessEquiv csenv m2 trace ty1 ty2 ( nullnessOfTy g sty1) ( nullnessOfTy g sty2)
1334
1335
}
1335
1336
1336
1337
| ( TType_ app ( tc1, [ ms1], _), _) when ( tc1.IsMeasureableReprTycon && typeEquiv csenv.g sty2 ( reduceTyconRefMeasureableOrProvided csenv.g tc1 [ ms1])) ->
1337
1338
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 ) )
1339
1340
do ! SolveNullnessEquiv csenv m2 trace ty1 ty2 ( nullnessOfTy g sty1) ( nullnessOfTy g sty2)
1340
1341
}
1341
1342
@@ -1518,13 +1519,13 @@ and SolveTypeSubsumesType (csenv: ConstraintSolverEnv) ndeep m2 (trace: Optional
1518
1519
// Enforce the identities float=float<1>, float32=float32<1> and decimal=decimal<1>
1519
1520
| _, TType_ app ( tc2, [ ms2], _) when tc2.IsMeasureableReprTycon && typeEquiv csenv.g sty1 ( reduceTyconRefMeasureableOrProvided csenv.g tc2 [ ms2]) ->
1520
1521
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 ) )
1522
1523
do ! SolveNullnessSubsumesNullness csenv m2 trace ty1 ty2 ( nullnessOfTy g sty1) ( nullnessOfTy g sty2)
1523
1524
}
1524
1525
1525
1526
| TType_ app ( tc1, [ ms1], _), _ when tc1.IsMeasureableReprTycon && typeEquiv csenv.g sty2 ( reduceTyconRefMeasureableOrProvided csenv.g tc1 [ ms1]) ->
1526
1527
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 ) )
1528
1529
do ! SolveNullnessSubsumesNullness csenv m2 trace ty1 ty2 ( nullnessOfTy g sty1) ( nullnessOfTy g sty2)
1529
1530
}
1530
1531
@@ -1620,7 +1621,7 @@ and DepthCheck ndeep m =
1620
1621
and SolveDimensionlessNumericType ( csenv : ConstraintSolverEnv ) ndeep m2 trace ty =
1621
1622
match getMeasureOfType csenv.g ty with
1622
1623
| 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 ) ])
1624
1625
| None ->
1625
1626
CompleteD
1626
1627
@@ -1727,7 +1728,7 @@ and SolveMemberConstraint (csenv: ConstraintSolverEnv) ignoreUnresolvedOverload
1727
1728
| Some ( tcref, ms1) ->
1728
1729
let ms2 = freshMeasure ()
1729
1730
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 ))])
1731
1732
return TTraitBuiltIn
1732
1733
1733
1734
| _ ->
@@ -1736,7 +1737,7 @@ and SolveMemberConstraint (csenv: ConstraintSolverEnv) ignoreUnresolvedOverload
1736
1737
| Some ( tcref, ms2) ->
1737
1738
let ms1 = freshMeasure ()
1738
1739
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 ))])
1740
1741
return TTraitBuiltIn
1741
1742
1742
1743
| _ ->
@@ -1870,7 +1871,7 @@ and SolveMemberConstraint (csenv: ConstraintSolverEnv) ignoreUnresolvedOverload
1870
1871
match getMeasureOfType g argTy1 with
1871
1872
| Some ( tcref, _) ->
1872
1873
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 ))])
1874
1875
do ! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace retTy ( mkWoNullAppTy tcref [ TType_ measure ms1])
1875
1876
return TTraitBuiltIn
1876
1877
| None ->
@@ -1923,7 +1924,7 @@ and SolveMemberConstraint (csenv: ConstraintSolverEnv) ignoreUnresolvedOverload
1923
1924
do ! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argTy2 argTy1
1924
1925
match getMeasureOfType g argTy1 with
1925
1926
| 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 ) ])
1927
1928
return TTraitBuiltIn
1928
1929
1929
1930
| _ ->
0 commit comments