@@ -370,6 +370,7 @@ let ShowAccessDomain ad =
370370// Solve
371371
372372exception NonRigidTyparof DisplayEnv * string option * range * TType * TType * range
373+ exception LocallyAbortOperationThatFailsToResolveOverload
373374exception LocallyAbortOperationThatLosesAbbrevs
374375let localAbortD = ErrorD LocallyAbortOperationThatLosesAbbrevs
375376
@@ -738,19 +739,19 @@ and solveTypMeetsTyparConstraints (csenv:ConstraintSolverEnv) ndeep m2 trace ty
738739| Some destTypar->
739740 AddConstraint csenv ndeep m2 trace destTypar( TyparConstraint.DefaultsTo( priority, dty, m))
740741
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
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
745746| TyparConstraint.IsDelegate( aty, bty, m2) -> SolveTypIsDelegate csenv ndeep m2 trace ty aty bty
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
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
750751| TyparConstraint.SimpleChoice( tys, m2) -> SolveTypChoice csenv ndeep m2 trace ty tys
751752| TyparConstraint.CoercesTo( ty2, m2) -> SolveTypSubsumesTypKeepAbbrevs csenv ndeep m2 trace None ty2 ty
752- | TyparConstraint.MayResolveMember( traitInfo, m2) ->
753- SolveMemberConstraint csenvfalse ndeep m2 trace traitInfo++ ( fun _ -> CompleteD)
753+ | TyparConstraint.MayResolveMember( traitInfo, m2) ->
754+ SolveMemberConstraint csenvfalse false ndeep m2 trace traitInfo++ ( fun _ -> CompleteD)
754755)))
755756
756757
@@ -760,14 +761,15 @@ and SolveTypEqualsTyp (csenv:ConstraintSolverEnv) ndeep m2 (trace: OptionalTrace
760761let ndeep = ndeep+ 1
761762let aenv = csenv.EquivEnv
762763let g = csenv.g
763- if ty1=== ty2then CompleteDelse
764764
765765match cxslnwith
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=== ty2then CompleteDelse
772+
771773let canShortcut = not trace.HasTrace
772774let sty1 = stripTyEqnsA csenv.g canShortcut ty1
773775let sty2 = stripTyEqnsA csenv.g canShortcut ty2
@@ -941,7 +943,7 @@ and SolveDimensionlessNumericType (csenv:ConstraintSolverEnv) ndeep m2 trace ty
941943/// We pretend int and other types support a number of operators. In the actual IL for mscorlib they
942944/// don't, however the type-directed static optimization rules in the library code that makes use of this
943945/// will deal with the problem.
944- and SolveMemberConstraint ( csenv : ConstraintSolverEnv ) permitWeakResolution ndeep m2 trace ( TTrait ( tys , nm , memFlags , argtys , rty , sln )) : OperationResult < bool > =
946+ and SolveMemberConstraint ( csenv : ConstraintSolverEnv ) ignoreUnresolvedOverload permitWeakResolution ndeep m2 trace( TTrait ( tys , nm , memFlags , argtys , rty , sln )): OperationResult < bool > =
945947// Do not re-solve if already solved
946948if sln.Value.IsSomethen ResultDtrue else
947949let g = csenv.g
@@ -1298,9 +1300,12 @@ and SolveMemberConstraint (csenv:ConstraintSolverEnv) permitWeakResolution ndeep
12981300let frees = GetFreeTyparsOfMemberConstraint csenv traitInfo
12991301
13001302// If there's nothing left to learn then raise the errors
1301- ( if ( permitWeakResolution&& isNil support) || isNil freesthen errors
1302- // Otherwise re-record the trait waiting for canonicalization
1303- else AddMemberConstraint csenv ndeep m2 trace traitInfo support frees) ++ ( fun () -> ResultD TTraitUnsolved)
1303+ ( if ( permitWeakResolution&& isNil support) || isNil freesthen errors
1304+ // Otherwise re-record the trait waiting for canonicalization
1305+ else AddMemberConstraint csenv ndeep m2 trace traitInfo support frees) ++ ( fun () ->
1306+ match errorswith
1307+ | ErrorResult(_, UnresolvedOverloading_) when not ignoreUnresolvedOverload&& ( not ( nm= " op_Explicit" || nm= " op_Implicit" )) -> ErrorD LocallyAbortOperationThatFailsToResolveOverload
1308+ | _ -> ResultD TTraitUnsolved)
13041309)
13051310++
13061311( fun res -> RecordMemberConstraintSolution csenv.SolverState m trace traitInfo res))
@@ -1442,7 +1447,7 @@ and SolveRelevantMemberConstraintsForTypar (csenv:ConstraintSolverEnv) ndeep per
14421447 cxs
14431448|> AtLeastOneD( fun ( traitInfo , m2 ) ->
14441449let csenv = { csenvwith m= m2}
1445- SolveMemberConstraint csenv permitWeakResolution( ndeep+ 1 ) m2 trace traitInfo)
1450+ SolveMemberConstraint csenvtrue permitWeakResolution( ndeep+ 1 ) m2 trace traitInfo)
14461451
14471452and CanonicalizeRelevantMemberConstraints ( csenv : ConstraintSolverEnv ) ndeep trace tps =
14481453 SolveRelevantMemberConstraints csenv ndeeptrue trace tps
@@ -1957,18 +1962,22 @@ and CanMemberSigsMatchUpToCheck
19571962// to allow us to report the outer types involved in the constraint
19581963and private SolveTypSubsumesTypWithReport ( csenv : ConstraintSolverEnv ) ndeep m trace cxsln ty1 ty2 =
19591964 TryD( fun () -> SolveTypSubsumesTypKeepAbbrevs csenv ndeep m trace cxsln ty1 ty2)
1960- ( fun res ->
1961- match csenv.eContextInfowith
1962- | ContextInfo.RuntimeTypeTest isOperator->
1963- // test if we can cast other way around
1965+ ( function
1966+ | LocallyAbortOperationThatFailsToResolveOverload-> CompleteD
1967+ | res->
1968+ match csenv.eContextInfowith
1969+ | ContextInfo.RuntimeTypeTest isOperator->
1970+ // test if we can cast other way around
19641971match CollectThenUndo( fun newTrace -> SolveTypSubsumesTypKeepAbbrevs csenv ndeep m( OptionalTrace.WithTrace newTrace) cxsln ty2 ty1) with
19651972| OkResult_ -> ErrorD( ErrorsFromAddingSubsumptionConstraint( csenv.g, csenv.DisplayEnv, ty1, ty2, res, ContextInfo.DowncastUsedInsteadOfUpcast isOperator, m))
19661973| _ -> ErrorD( ErrorsFromAddingSubsumptionConstraint( csenv.g, csenv.DisplayEnv, ty1, ty2, res, ContextInfo.NoContext, m))
19671974| _ -> ErrorD( ErrorsFromAddingSubsumptionConstraint( csenv.g, csenv.DisplayEnv, ty1, ty2, res, csenv.eContextInfo, m)))
19681975
19691976and private SolveTypEqualsTypWithReport ( csenv : ConstraintSolverEnv ) ndeep m trace cxsln ty1 ty2 =
19701977 TryD( fun () -> SolveTypEqualsTypKeepAbbrevsWithCxsln csenv ndeep m trace cxsln ty1 ty2)
1971- ( fun res -> ErrorD( ErrorFromAddingTypeEquation( csenv.g, csenv.DisplayEnv, ty1, ty2, res, m)))
1978+ ( function
1979+ | LocallyAbortOperationThatFailsToResolveOverload-> CompleteD
1980+ | res-> ErrorD( ErrorFromAddingTypeEquation( csenv.g, csenv.DisplayEnv, ty1, ty2, res, m)))
19721981
19731982and ArgsMustSubsumeOrConvert
19741983( csenv : ConstraintSolverEnv )
@@ -2534,7 +2543,7 @@ let AddCxTypeMustSubsumeType contextInfo denv css m trace ty1 ty2 =
25342543|> RaiseOperationResult
25352544
25362545let AddCxMethodConstraint denv css m trace traitInfo =
2537- TryD( fun () -> SolveMemberConstraint( MakeConstraintSolverEnv ContextInfo.NoContext css m denv) false 0 m trace traitInfo++ ( fun _ -> CompleteD))
2546+ TryD( fun () -> SolveMemberConstraint( MakeConstraintSolverEnv ContextInfo.NoContext css m denv) true false 0 m trace traitInfo++ ( fun _ -> CompleteD))
25382547( fun res -> ErrorD( ErrorFromAddingConstraint( denv, res, m)))
25392548|> RaiseOperationResult
25402549
@@ -2592,7 +2601,7 @@ let CodegenWitnessThatTypSupportsTraitConstraint tcVal g amap m (traitInfo:Trait
25922601 InfoReader= new InfoReader( g, amap) }
25932602
25942603let csenv = MakeConstraintSolverEnv ContextInfo.NoContext css m( DisplayEnv.Empty g)
2595- SolveMemberConstraint csenvtrue 0 m NoTrace traitInfo++ ( fun _res ->
2604+ SolveMemberConstraint csenvtrue true 0 m NoTrace traitInfo++ ( fun _res ->
25962605let sln =
25972606match traitInfo.Solutionwith
25982607| None-> Choice4Of4()
@@ -2717,4 +2726,5 @@ let IsApplicableMethApprox g amap m (minfo:MethInfo) availObjTy =
27172726|> CommitOperationResult
27182727| _ -> true
27192728else
2720- true
2729+ true
2730+