@@ -276,8 +276,7 @@ let GetMeasureOfType g ty =
276276match tywith
277277| AppTy g( tcref,[ tyarg]) ->
278278match stripTyEqns g tyargwith
279- | TType_ measure ms->
280- if measureEquiv g ms Measure.Onethen Noneelse Some( tcref, ms)
279+ | TType_ measure mswhen not ( measureEquiv g ms Measure.One) -> Some( tcref, ms)
281280| _ -> None
282281| _ -> None
283282
@@ -451,13 +450,12 @@ and SolveTypStaticReq (csenv:ConstraintSolverEnv) trace req ty =
451450// requires that a type constructor be known at compile time
452451match stripTyparEqns tywith
453452| TType_ measure ms->
454- let vs = ListMeasureVarOccsWithNonZeroExponents ms
455- IterateD( fun (( tpr : Typar ), _ ) -> SolveTypStaticReqTypar csenv trace req tpr) vs
456-
453+ let vs = ListMeasureVarOccsWithNonZeroExponents ms
454+ IterateD( fun (( tpr : Typar ), _ ) -> SolveTypStaticReqTypar csenv trace req tpr) vs
457455| _ ->
458- match tryAnyParTy csenv.g tywith
459- | Some tpr-> SolveTypStaticReqTypar csenv trace req tpr
460- | None-> CompleteD
456+ match tryAnyParTy csenv.g tywith
457+ | Some tpr-> SolveTypStaticReqTypar csenv trace req tpr
458+ | None-> CompleteD
461459
462460let rec TransactDynamicReq ( trace : OptionalTrace ) ( tpr : Typar ) req =
463461let orig = tpr.DynamicReq
@@ -475,18 +473,18 @@ and SolveTypDynamicReq (csenv:ConstraintSolverEnv) trace req ty =
475473
476474let SubstMeasureWarnIfRigid ( csenv : ConstraintSolverEnv ) trace ( v : Typar ) ms =
477475if v.Rigidity.WarnIfUnified&& not ( isAnyParTy csenv.g( TType_ measure ms)) then
478- // NOTE: we grab the name eagerly to make sure the type variable prints as a type variable
479- let tpnmOpt = if v.IsCompilerGeneratedthen Noneelse Some v.Name
480- SolveTypStaticReq csenv trace v.StaticReq( TType_ measure ms) ++ ( fun () ->
481- SubstMeasure v ms;
482- WarnD( NonRigidTypar( csenv.DisplayEnv, tpnmOpt, v.Range, TType_ measure( Measure.Var v), TType_ measure ms, csenv.m)))
476+ // NOTE: we grab the name eagerly to make sure the type variable prints as a type variable
477+ let tpnmOpt = if v.IsCompilerGeneratedthen Noneelse Some v.Name
478+ SolveTypStaticReq csenv trace v.StaticReq( TType_ measure ms) ++ ( fun () ->
479+ SubstMeasure v ms;
480+ WarnD( NonRigidTypar( csenv.DisplayEnv, tpnmOpt, v.Range, TType_ measure( Measure.Var v), TType_ measure ms, csenv.m)))
483481else
484- // Propagate static requirements from 'tp' to 'ty'
485- SolveTypStaticReq csenv trace v.StaticReq( TType_ measure ms) ++ ( fun () ->
486- SubstMeasure v ms;
487- if v.Rigidity= TyparRigidity.Anon&& measureEquiv csenv.g ms Measure.Onethen
488- WarnD( Error( FSComp.SR.csCodeLessGeneric(), v.Range))
489- else CompleteD)
482+ // Propagate static requirements from 'tp' to 'ty'
483+ SolveTypStaticReq csenv trace v.StaticReq( TType_ measure ms) ++ ( fun () ->
484+ SubstMeasure v ms;
485+ if v.Rigidity= TyparRigidity.Anon&& measureEquiv csenv.g ms Measure.Onethen
486+ WarnD( Error( FSComp.SR.csCodeLessGeneric(), v.Range))
487+ else CompleteD)
490488
491489/// Imperatively unify the unit-of-measure expression ms against 1.
492490/// There are three cases
@@ -501,15 +499,14 @@ let UnifyMeasureWithOne (csenv:ConstraintSolverEnv) trace ms =
501499// If there is at least one non-rigid variable v with exponent e, then we can unify
502500match FindPreferredTypar nonRigidVarswith
503501| ( v, e):: vs->
504- let unexpandedCons = ListMeasureConOccsWithNonZeroExponents csenv.gfalse ms
505- let newms = ProdMeasures( List.map( fun ( c , e' ) -> Measure.RationalPower( Measure.Con c, NegRational( DivRational e' e))) unexpandedCons
506- @ List.map( fun ( v , e' ) -> Measure.RationalPower( Measure.Var v, NegRational( DivRational e' e))) ( vs@ rigidVars))
502+ let unexpandedCons = ListMeasureConOccsWithNonZeroExponents csenv.gfalse ms
503+ let newms = ProdMeasures( List.map( fun ( c , e' ) -> Measure.RationalPower( Measure.Con c, NegRational( DivRational e' e))) unexpandedCons
504+ @ List.map( fun ( v , e' ) -> Measure.RationalPower( Measure.Var v, NegRational( DivRational e' e))) ( vs@ rigidVars))
507505
508- SubstMeasureWarnIfRigid csenv trace v newms
506+ SubstMeasureWarnIfRigid csenv trace v newms
509507
510508// Otherwise we require ms to be 1
511- | [] ->
512- if measureEquiv csenv.g ms Measure.Onethen CompleteDelse localAbortD
509+ | [] -> if measureEquiv csenv.g ms Measure.Onethen CompleteDelse localAbortD
513510
514511/// Imperatively unify unit-of-measure expression ms1 against ms2
515512let UnifyMeasures ( csenv : ConstraintSolverEnv ) trace ms1 ms2 =
@@ -599,12 +596,12 @@ and GetMeasureVarGcdInTypes v tys =
599596let NormalizeExponentsInTypeScheme uvars ty =
600597 uvars|> List.map( fun v ->
601598let expGcd = AbsRational( GetMeasureVarGcdInType v ty)
602- if expGcd= OneRational|| expGcd= ZeroRational
603- then v
604- else
605- let v ' = NewAnonTypar( TyparKind.Measure, v.Range, TyparRigidity.Flexible, v.StaticReq, v.DynamicReq)
606- SubstMeasure v( Measure.RationalPower( Measure.Var v', DivRational OneRational expGcd))
607- v')
599+ if expGcd= OneRational|| expGcd= ZeroRationalthen
600+ v
601+ else
602+ let v ' = NewAnonTypar( TyparKind.Measure, v.Range, TyparRigidity.Flexible, v.StaticReq, v.DynamicReq)
603+ SubstMeasure v( Measure.RationalPower( Measure.Var v', DivRational OneRational expGcd))
604+ v')
608605
609606
610607// We normalize unit-of-measure-polymorphic type schemes. There
@@ -636,7 +633,8 @@ let NormalizeExponentsInTypeScheme uvars ty =
636633let SimplifyMeasuresInTypeScheme g resultFirst ( generalizable : Typar list ) ty constraints =
637634// Only bother if we're generalizing over at least one unit-of-measure variable
638635let uvars , vars =
639- generalizable|> List.partition( fun v -> v.Kind= TyparKind.Measure&& v.Rigidity<> TyparRigidity.Rigid)
636+ generalizable
637+ |> List.partition( fun v -> v.Kind= TyparKind.Measure&& v.Rigidity<> TyparRigidity.Rigid)
640638
641639match uvarswith
642640| [] -> generalizable
@@ -656,7 +654,7 @@ let CheckWarnIfRigid (csenv:ConstraintSolverEnv) ty1 (r:Typar) ty =
656654| None-> true
657655| Some tp2->
658656not tp2.IsCompilerGenerated&&
659- ( r.IsCompilerGenerated||
657+ ( r.IsCompilerGenerated||
660658// exclude this warning for two identically named user-specified type parameters, e.g. from different mutually recursive functions or types
661659 r.DisplayName<> tp2.DisplayName)
662660
@@ -722,17 +720,17 @@ and solveTypMeetsTyparConstraints (csenv:ConstraintSolverEnv) ndeep m2 trace ty
722720if not ( isTyparTy g ty) || typeEquiv g ty dtythen CompleteDelse
723721 AddConstraint csenv ndeep m2 trace( destTyparTy g ty) ( TyparConstraint.DefaultsTo( priority, dty, m))
724722
725- | TyparConstraint.SupportsNull m2-> SolveTypSupportsNull csenv ndeep m2 trace ty
726- | TyparConstraint.IsEnum( underlying, m2) -> SolveTypIsEnum csenv ndeep m2 trace ty underlying
727- | TyparConstraint.SupportsComparison( m2) -> SolveTypeSupportsComparison csenv ndeep m2 trace ty
728- | TyparConstraint.SupportsEquality( m2) -> SolveTypSupportsEquality csenv ndeep m2 trace ty
729- | TyparConstraint.IsDelegate( aty, bty, m2) -> SolveTypIsDelegate csenv ndeep m2 trace ty aty bty
730- | TyparConstraint.IsNonNullableStruct m2-> SolveTypIsNonNullableValueType csenv ndeep m2 trace ty
731- | TyparConstraint.IsUnmanaged m2-> SolveTypIsUnmanaged csenv ndeep m2 trace ty
732- | TyparConstraint.IsReferenceType m2-> SolveTypIsReferenceType csenv ndeep m2 trace ty
733- | TyparConstraint.RequiresDefaultConstructor m2-> SolveTypRequiresDefaultConstructor csenv ndeep m2 trace ty
734- | TyparConstraint.SimpleChoice( tys, m2) -> SolveTypChoice csenv ndeep m2 trace ty tys
735- | TyparConstraint.CoercesTo( ty2, m2) -> SolveTypSubsumesTypKeepAbbrevs csenv ndeep m2 trace None ty2 ty
723+ | TyparConstraint.SupportsNull m2-> SolveTypSupportsNull csenv ndeep m2 trace ty
724+ | TyparConstraint.IsEnum( underlying, m2) -> SolveTypIsEnum csenv ndeep m2 trace ty underlying
725+ | TyparConstraint.SupportsComparison( m2) -> SolveTypeSupportsComparison csenv ndeep m2 trace ty
726+ | TyparConstraint.SupportsEquality( m2) -> SolveTypSupportsEquality csenv ndeep m2 trace ty
727+ | TyparConstraint.IsDelegate( aty, bty, m2) -> SolveTypIsDelegate csenv ndeep m2 trace ty aty bty
728+ | TyparConstraint.IsNonNullableStruct m2-> SolveTypIsNonNullableValueType csenv ndeep m2 trace ty
729+ | TyparConstraint.IsUnmanaged m2-> SolveTypIsUnmanaged csenv ndeep m2 trace ty
730+ | TyparConstraint.IsReferenceType m2-> SolveTypIsReferenceType csenv ndeep m2 trace ty
731+ | TyparConstraint.RequiresDefaultConstructor m2-> SolveTypRequiresDefaultConstructor csenv ndeep m2 trace ty
732+ | TyparConstraint.SimpleChoice( tys, m2) -> SolveTypChoice csenv ndeep m2 trace ty tys
733+ | TyparConstraint.CoercesTo( ty2, m2) -> SolveTypSubsumesTypKeepAbbrevs csenv ndeep m2 trace None ty2 ty
736734| TyparConstraint.MayResolveMember( traitInfo, m2) ->
737735 SolveMemberConstraint csenvfalse false ndeep m2 trace traitInfo++ ( fun _ -> CompleteD)
738736)))
@@ -868,16 +866,15 @@ and SolveTypSubsumesTyp (csenv:ConstraintSolverEnv) ndeep m2 (trace: OptionalTra
868866// 'a[] :> IReadOnlyCollection<'b> ---> 'a = 'b
869867// Note we don't support co-variance on array types nor
870868// the special .NET conversions for these types
871- if
872- ( isArray1DTy g ty2&&
873- isAppTy g ty1&&
874- ( let tcr1 = tcrefOfAppTy g ty1
875- tyconRefEq g tcr1 g.tcref_ System_ Collections_ Generic_ IList||
876- tyconRefEq g tcr1 g.tcref_ System_ Collections_ Generic_ ICollection||
877- tyconRefEq g tcr1 g.tcref_ System_ Collections_ Generic_ IReadOnlyList||
878- tyconRefEq g tcr1 g.tcref_ System_ Collections_ Generic_ IReadOnlyCollection||
879- tyconRefEq g tcr1 g.tcref_ System_ Collections_ Generic_ IEnumerable)) then
880-
869+ if ( isArray1DTy g ty2&&
870+ isAppTy g ty1&&
871+ ( let tcr1 = tcrefOfAppTy g ty1
872+ tyconRefEq g tcr1 g.tcref_ System_ Collections_ Generic_ IList||
873+ tyconRefEq g tcr1 g.tcref_ System_ Collections_ Generic_ ICollection||
874+ tyconRefEq g tcr1 g.tcref_ System_ Collections_ Generic_ IReadOnlyList||
875+ tyconRefEq g tcr1 g.tcref_ System_ Collections_ Generic_ IReadOnlyCollection||
876+ tyconRefEq g tcr1 g.tcref_ System_ Collections_ Generic_ IEnumerable))
877+ then
881878let _ , tinst = destAppTy g ty1
882879match tinstwith
883880| [ ty1arg] ->
@@ -888,7 +885,6 @@ and SolveTypSubsumesTyp (csenv:ConstraintSolverEnv) ndeep m2 (trace: OptionalTra
888885// D<inst> :> Head<_> --> C<inst'> :> Head<_> for the
889886// first interface or super-class C supported by D which
890887// may feasibly convert to Head.
891-
892888else
893889match FindUniqueFeasibleSupertype g amap m ty1 ty2with
894890| None-> ErrorD( ConstraintSolverTypesNotInSubsumptionRelation( denv, ty1, ty2, m, m2))
@@ -921,10 +917,10 @@ and DepthCheck ndeep m =
921917// If this is a type that's parameterized on a unit-of-measure (expected to be numeric), unify its measure with 1
922918and SolveDimensionlessNumericType ( csenv : ConstraintSolverEnv ) ndeep m2 trace ty =
923919match GetMeasureOfType csenv.g tywith
924- | Some( tcref, _) ->
925- SolveTypEqualsTypKeepAbbrevs csenv ndeep m2 trace ty( mkAppTy tcref[ TType_ measure Measure.One])
920+ | Some( tcref, _) ->
921+ SolveTypEqualsTypKeepAbbrevs csenv ndeep m2 trace ty( mkAppTy tcref[ TType_ measure Measure.One])
926922| None->
927- CompleteD
923+ CompleteD
928924
929925/// We do a bunch of fakery to pretend that primitive types have certain members.
930926/// We pretend int and other types support a number of operators. In the actual IL for mscorlib they