@@ -370,7 +370,6 @@ let ShowAccessDomain ad =
370370// Solve
371371
372372exception NonRigidTypar of DisplayEnv * string option * range * TType * TType * range
373- exception LocallyAbortOperationThatFailsToResolveOverload
374373exception LocallyAbortOperationThatLosesAbbrevs
375374let localAbortD = ErrorD LocallyAbortOperationThatLosesAbbrevs
376375
@@ -739,19 +738,19 @@ and solveTypMeetsTyparConstraints (csenv:ConstraintSolverEnv) ndeep m2 trace ty
739738 | Some destTypar ->
740739 AddConstraint csenv ndeep m2 trace destTypar ( TyparConstraint.DefaultsTo( priority, dty, m))
741740
742- | TyparConstraint.SupportsNull m2 -> SolveTypSupportsNull csenv ndeep m2 trace ty
743- | TyparConstraint.IsEnum( underlying, m2) -> SolveTypIsEnum csenv ndeep m2 trace ty underlying
744- | TyparConstraint.SupportsComparison( m2) -> SolveTypeSupportsComparison csenv ndeep m2 trace ty
745- | TyparConstraint.SupportsEquality( m2) -> SolveTypSupportsEquality csenv ndeep m2 trace ty
741+ | TyparConstraint.SupportsNull m2 -> SolveTypSupportsNull csenv ndeep m2 trace ty
742+ | TyparConstraint.IsEnum( underlying, m2) -> SolveTypIsEnum csenv ndeep m2 trace ty underlying
743+ | TyparConstraint.SupportsComparison( m2) -> SolveTypeSupportsComparison csenv ndeep m2 trace ty
744+ | TyparConstraint.SupportsEquality( m2) -> SolveTypSupportsEquality csenv ndeep m2 trace ty
746745 | TyparConstraint.IsDelegate( aty, bty, m2) -> SolveTypIsDelegate csenv ndeep m2 trace ty aty bty
747- | TyparConstraint.IsNonNullableStruct m2 -> SolveTypIsNonNullableValueType csenv ndeep m2 trace ty
748- | TyparConstraint.IsUnmanaged m2 -> SolveTypIsUnmanaged csenv ndeep m2 trace ty
749- | TyparConstraint.IsReferenceType m2 -> SolveTypIsReferenceType csenv ndeep m2 trace ty
750- | TyparConstraint.RequiresDefaultConstructor m2 -> SolveTypRequiresDefaultConstructor csenv ndeep m2 trace ty
746+ | TyparConstraint.IsNonNullableStruct m2 -> SolveTypIsNonNullableValueType csenv ndeep m2 trace ty
747+ | TyparConstraint.IsUnmanaged m2 -> SolveTypIsUnmanaged csenv ndeep m2 trace ty
748+ | TyparConstraint.IsReferenceType m2 -> SolveTypIsReferenceType csenv ndeep m2 trace ty
749+ | TyparConstraint.RequiresDefaultConstructor m2 -> SolveTypRequiresDefaultConstructor csenv ndeep m2 trace ty
751750 | TyparConstraint.SimpleChoice( tys, m2) -> SolveTypChoice csenv ndeep m2 trace ty tys
752751 | TyparConstraint.CoercesTo( ty2, m2) -> SolveTypSubsumesTypKeepAbbrevs csenv ndeep m2 trace None ty2 ty
753- | TyparConstraint.MayResolveMember( traitInfo, m2) ->
754- SolveMemberConstraint csenv false false ndeep m2 trace traitInfo ++ ( fun _ -> CompleteD)
752+ | TyparConstraint.MayResolveMember( traitInfo, m2) ->
753+ SolveMemberConstraint csenv false ndeep m2 trace traitInfo ++ ( fun _ -> CompleteD)
755754 )))
756755
757756
@@ -761,15 +760,14 @@ and SolveTypEqualsTyp (csenv:ConstraintSolverEnv) ndeep m2 (trace: OptionalTrace
761760 let ndeep = ndeep + 1
762761 let aenv = csenv.EquivEnv
763762 let g = csenv.g
763+ if ty1 === ty2 then CompleteD else
764764
765765 match cxsln with
766766 | Some ( traitInfo, traitSln) when traitInfo.Solution.IsNone ->
767767 // If this is an overload resolution at this point it's safe to assume the candidate member being evaluated solves this member constraint.
768768 TransactMemberConstraintSolution traitInfo trace traitSln
769769 | _ -> ()
770770
771- if ty1 === ty2 then CompleteD else
772-
773771 let canShortcut = not trace.HasTrace
774772 let sty1 = stripTyEqnsA csenv.g canShortcut ty1
775773 let sty2 = stripTyEqnsA csenv.g canShortcut ty2
@@ -943,7 +941,7 @@ and SolveDimensionlessNumericType (csenv:ConstraintSolverEnv) ndeep m2 trace ty
943941/// We pretend int and other types support a number of operators. In the actual IL for mscorlib they
944942/// don't, however the type-directed static optimization rules in the library code that makes use of this
945943/// will deal with the problem.
946- and SolveMemberConstraint ( csenv : ConstraintSolverEnv ) ignoreUnresolvedOverload permitWeakResolution ndeep m2 trace ( TTrait ( tys , nm , memFlags , argtys , rty , sln )): OperationResult < bool > =
944+ and SolveMemberConstraint ( csenv : ConstraintSolverEnv ) permitWeakResolution ndeep m2 trace ( TTrait ( tys , nm , memFlags , argtys , rty , sln )) : OperationResult < bool > =
947945 // Do not re-solve if already solved
948946 if sln.Value.IsSome then ResultD true else
949947 let g = csenv.g
@@ -1300,12 +1298,9 @@ and SolveMemberConstraint (csenv:ConstraintSolverEnv) ignoreUnresolvedOverload p
13001298 let frees = GetFreeTyparsOfMemberConstraint csenv traitInfo
13011299
13021300 // If there's nothing left to learn then raise the errors
1303- ( if ( permitWeakResolution && isNil support) || isNil frees then errors
1304- // Otherwise re-record the trait waiting for canonicalization
1305- else AddMemberConstraint csenv ndeep m2 trace traitInfo support frees) ++ ( fun () ->
1306- match errors with
1307- | ErrorResult (_, UnresolvedOverloading _) when not ignoreUnresolvedOverload && ( not ( nm = " op_Explicit" || nm = " op_Implicit" )) -> ErrorD LocallyAbortOperationThatFailsToResolveOverload
1308- | _ -> ResultD TTraitUnsolved)
1301+ ( if ( permitWeakResolution && isNil support) || isNil frees then errors
1302+ // Otherwise re-record the trait waiting for canonicalization
1303+ else AddMemberConstraint csenv ndeep m2 trace traitInfo support frees) ++ ( fun () -> ResultD TTraitUnsolved)
13091304 )
13101305 ++
13111306 ( fun res -> RecordMemberConstraintSolution csenv.SolverState m trace traitInfo res))
@@ -1447,7 +1442,7 @@ and SolveRelevantMemberConstraintsForTypar (csenv:ConstraintSolverEnv) ndeep per
14471442 cxs
14481443 |> AtLeastOneD ( fun ( traitInfo , m2 ) ->
14491444 let csenv = { csenv with m = m2 }
1450- SolveMemberConstraint csenv true permitWeakResolution ( ndeep+ 1 ) m2 trace traitInfo)
1445+ SolveMemberConstraint csenv permitWeakResolution ( ndeep+ 1 ) m2 trace traitInfo)
14511446
14521447and CanonicalizeRelevantMemberConstraints ( csenv : ConstraintSolverEnv ) ndeep trace tps =
14531448 SolveRelevantMemberConstraints csenv ndeep true trace tps
@@ -1962,22 +1957,18 @@ and CanMemberSigsMatchUpToCheck
19621957// to allow us to report the outer types involved in the constraint
19631958and private SolveTypSubsumesTypWithReport ( csenv : ConstraintSolverEnv ) ndeep m trace cxsln ty1 ty2 =
19641959 TryD ( fun () -> SolveTypSubsumesTypKeepAbbrevs csenv ndeep m trace cxsln ty1 ty2)
1965- ( function
1966- | LocallyAbortOperationThatFailsToResolveOverload -> CompleteD
1967- | res ->
1968- match csenv.eContextInfo with
1969- | ContextInfo.RuntimeTypeTest isOperator ->
1970- // test if we can cast other way around
1960+ ( fun res ->
1961+ match csenv.eContextInfo with
1962+ | ContextInfo.RuntimeTypeTest isOperator ->
1963+ // test if we can cast other way around
19711964 match CollectThenUndo ( fun newTrace -> SolveTypSubsumesTypKeepAbbrevs csenv ndeep m ( OptionalTrace.WithTrace newTrace) cxsln ty2 ty1) with
19721965 | OkResult _ -> ErrorD ( ErrorsFromAddingSubsumptionConstraint( csenv.g, csenv.DisplayEnv, ty1, ty2, res, ContextInfo.DowncastUsedInsteadOfUpcast isOperator, m))
19731966 | _ -> ErrorD ( ErrorsFromAddingSubsumptionConstraint( csenv.g, csenv.DisplayEnv, ty1, ty2, res, ContextInfo.NoContext, m))
19741967 | _ -> ErrorD ( ErrorsFromAddingSubsumptionConstraint( csenv.g, csenv.DisplayEnv, ty1, ty2, res, csenv.eContextInfo, m)))
19751968
19761969and private SolveTypEqualsTypWithReport ( csenv : ConstraintSolverEnv ) ndeep m trace cxsln ty1 ty2 =
19771970 TryD ( fun () -> SolveTypEqualsTypKeepAbbrevsWithCxsln csenv ndeep m trace cxsln ty1 ty2)
1978- ( function
1979- | LocallyAbortOperationThatFailsToResolveOverload -> CompleteD
1980- | res -> ErrorD ( ErrorFromAddingTypeEquation( csenv.g, csenv.DisplayEnv, ty1, ty2, res, m)))
1971+ ( fun res -> ErrorD ( ErrorFromAddingTypeEquation( csenv.g, csenv.DisplayEnv, ty1, ty2, res, m)))
19811972
19821973and ArgsMustSubsumeOrConvert
19831974 ( csenv : ConstraintSolverEnv )
@@ -2543,7 +2534,7 @@ let AddCxTypeMustSubsumeType contextInfo denv css m trace ty1 ty2 =
25432534 |> RaiseOperationResult
25442535
25452536let AddCxMethodConstraint denv css m trace traitInfo =
2546- TryD ( fun () -> SolveMemberConstraint ( MakeConstraintSolverEnv ContextInfo.NoContext css m denv) true false 0 m trace traitInfo ++ ( fun _ -> CompleteD))
2537+ TryD ( fun () -> SolveMemberConstraint ( MakeConstraintSolverEnv ContextInfo.NoContext css m denv) false 0 m trace traitInfo ++ ( fun _ -> CompleteD))
25472538 ( fun res -> ErrorD ( ErrorFromAddingConstraint( denv, res, m)))
25482539 |> RaiseOperationResult
25492540
@@ -2601,7 +2592,7 @@ let CodegenWitnessThatTypSupportsTraitConstraint tcVal g amap m (traitInfo:Trait
26012592 InfoReader = new InfoReader( g, amap) }
26022593
26032594 let csenv = MakeConstraintSolverEnv ContextInfo.NoContext css m ( DisplayEnv.Empty g)
2604- SolveMemberConstraint csenv true true 0 m NoTrace traitInfo ++ ( fun _res ->
2595+ SolveMemberConstraint csenv true 0 m NoTrace traitInfo ++ ( fun _res ->
26052596 let sln =
26062597 match traitInfo.Solution with
26072598 | None -> Choice4Of4()
@@ -2725,5 +2716,4 @@ let IsApplicableMethApprox g amap m (minfo:MethInfo) availObjTy =
27252716 |> CommitOperationResult
27262717 | _ -> true
27272718 else
2728- true
2729-
2719+ true
0 commit comments