@@ -372,6 +372,7 @@ let ShowAccessDomain ad =
372372// Solve
373373
374374exception NonRigidTyparof DisplayEnv * string option * range * TType * TType * range
375+ exception LocallyAbortOperationThatFailsToResolveOverload
375376exception LocallyAbortOperationThatLosesAbbrevs
376377let localAbortD = ErrorD LocallyAbortOperationThatLosesAbbrevs
377378
@@ -740,19 +741,19 @@ and solveTypMeetsTyparConstraints (csenv:ConstraintSolverEnv) ndeep m2 trace ty
740741| Some destTypar->
741742 AddConstraint csenv ndeep m2 trace destTypar( TyparConstraint.DefaultsTo( priority, dty, m))
742743
743- | TyparConstraint.SupportsNull m2-> SolveTypSupportsNull csenv ndeep m2 trace ty
744- | TyparConstraint.IsEnum( underlying, m2) -> SolveTypIsEnum csenv ndeep m2 trace ty underlying
745- | TyparConstraint.SupportsComparison( m2) -> SolveTypeSupportsComparison csenv ndeep m2 trace ty
746- | TyparConstraint.SupportsEquality( m2) -> SolveTypSupportsEquality csenv ndeep m2 trace ty
744+ | TyparConstraint.SupportsNull m2-> SolveTypSupportsNull csenv ndeep m2 trace ty
745+ | TyparConstraint.IsEnum( underlying, m2) -> SolveTypIsEnum csenv ndeep m2 trace ty underlying
746+ | TyparConstraint.SupportsComparison( m2) -> SolveTypeSupportsComparison csenv ndeep m2 trace ty
747+ | TyparConstraint.SupportsEquality( m2) -> SolveTypSupportsEquality csenv ndeep m2 trace ty
747748| TyparConstraint.IsDelegate( aty, bty, m2) -> SolveTypIsDelegate csenv ndeep m2 trace ty aty bty
748- | TyparConstraint.IsNonNullableStruct m2-> SolveTypIsNonNullableValueType csenv ndeep m2 trace ty
749- | TyparConstraint.IsUnmanaged m2-> SolveTypIsUnmanaged csenv ndeep m2 trace ty
750- | TyparConstraint.IsReferenceType m2-> SolveTypIsReferenceType csenv ndeep m2 trace ty
751- | TyparConstraint.RequiresDefaultConstructor m2-> SolveTypRequiresDefaultConstructor csenv ndeep m2 trace ty
749+ | TyparConstraint.IsNonNullableStruct m2-> SolveTypIsNonNullableValueType csenv ndeep m2 trace ty
750+ | TyparConstraint.IsUnmanaged m2-> SolveTypIsUnmanaged csenv ndeep m2 trace ty
751+ | TyparConstraint.IsReferenceType m2-> SolveTypIsReferenceType csenv ndeep m2 trace ty
752+ | TyparConstraint.RequiresDefaultConstructor m2-> SolveTypRequiresDefaultConstructor csenv ndeep m2 trace ty
752753| TyparConstraint.SimpleChoice( tys, m2) -> SolveTypChoice csenv ndeep m2 trace ty tys
753754| TyparConstraint.CoercesTo( ty2, m2) -> SolveTypSubsumesTypKeepAbbrevs csenv ndeep m2 trace None ty2 ty
754- | TyparConstraint.MayResolveMember( traitInfo, m2) ->
755- SolveMemberConstraint csenvfalse ndeep m2 trace traitInfo++ ( fun _ -> CompleteD)
755+ | TyparConstraint.MayResolveMember( traitInfo, m2) ->
756+ SolveMemberConstraint csenvfalse false ndeep m2 trace traitInfo++ ( fun _ -> CompleteD)
756757)))
757758
758759
@@ -762,14 +763,15 @@ and SolveTypEqualsTyp (csenv:ConstraintSolverEnv) ndeep m2 (trace: OptionalTrace
762763let ndeep = ndeep+ 1
763764let aenv = csenv.EquivEnv
764765let g = csenv.g
765- if ty1=== ty2then CompleteDelse
766766
767767match cxslnwith
768768| Some( traitInfo, traitSln) when traitInfo.Solution.IsNone->
769769// If this is an overload resolution at this point it's safe to assume the candidate member being evaluated solves this member constraint.
770770 TransactMemberConstraintSolution traitInfo trace traitSln
771771| _ -> ()
772772
773+ if ty1=== ty2then CompleteDelse
774+
773775let canShortcut = not trace.HasTrace
774776let sty1 = stripTyEqnsA csenv.g canShortcut ty1
775777let sty2 = stripTyEqnsA csenv.g canShortcut ty2
@@ -943,7 +945,7 @@ and SolveDimensionlessNumericType (csenv:ConstraintSolverEnv) ndeep m2 trace ty
943945/// We pretend int and other types support a number of operators. In the actual IL for mscorlib they
944946/// don't, however the type-directed static optimization rules in the library code that makes use of this
945947/// will deal with the problem.
946- and SolveMemberConstraint ( csenv : ConstraintSolverEnv ) permitWeakResolution ndeep m2 trace ( TTrait ( tys , nm , memFlags , argtys , rty , sln )) : OperationResult < bool > =
948+ and SolveMemberConstraint ( csenv : ConstraintSolverEnv ) ignoreUnresolvedOverload permitWeakResolution ndeep m2 trace( TTrait ( tys , nm , memFlags , argtys , rty , sln )): OperationResult < bool > =
947949// Do not re-solve if already solved
948950if sln.Value.IsSomethen ResultDtrue else
949951let g = csenv.g
@@ -1300,9 +1302,12 @@ and SolveMemberConstraint (csenv:ConstraintSolverEnv) permitWeakResolution ndeep
13001302let frees = GetFreeTyparsOfMemberConstraint csenv traitInfo
13011303
13021304// If there's nothing left to learn then raise the errors
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 () -> ResultD TTraitUnsolved)
1305+ ( if ( permitWeakResolution&& isNil support) || isNil freesthen errors
1306+ // Otherwise re-record the trait waiting for canonicalization
1307+ else AddMemberConstraint csenv ndeep m2 trace traitInfo support frees) ++ ( fun () ->
1308+ match errorswith
1309+ | ErrorResult(_, UnresolvedOverloading_) when not ignoreUnresolvedOverload&& ( not ( nm= " op_Explicit" || nm= " op_Implicit" )) -> ErrorD LocallyAbortOperationThatFailsToResolveOverload
1310+ | _ -> ResultD TTraitUnsolved)
13061311)
13071312++
13081313( fun res -> RecordMemberConstraintSolution csenv.SolverState m trace traitInfo res))
@@ -1444,7 +1449,7 @@ and SolveRelevantMemberConstraintsForTypar (csenv:ConstraintSolverEnv) ndeep per
14441449 cxs
14451450|> AtLeastOneD( fun ( traitInfo , m2 ) ->
14461451let csenv = { csenvwith m= m2}
1447- SolveMemberConstraint csenv permitWeakResolution( ndeep+ 1 ) m2 trace traitInfo)
1452+ SolveMemberConstraint csenvtrue permitWeakResolution( ndeep+ 1 ) m2 trace traitInfo)
14481453
14491454and CanonicalizeRelevantMemberConstraints ( csenv : ConstraintSolverEnv ) ndeep trace tps =
14501455 SolveRelevantMemberConstraints csenv ndeeptrue trace tps
@@ -1959,18 +1964,22 @@ and CanMemberSigsMatchUpToCheck
19591964// to allow us to report the outer types involved in the constraint
19601965and private SolveTypSubsumesTypWithReport ( csenv : ConstraintSolverEnv ) ndeep m trace cxsln ty1 ty2 =
19611966 TryD( fun () -> SolveTypSubsumesTypKeepAbbrevs csenv ndeep m trace cxsln ty1 ty2)
1962- ( fun res ->
1963- match csenv.eContextInfowith
1964- | ContextInfo.RuntimeTypeTest isOperator->
1965- // test if we can cast other way around
1967+ ( function
1968+ | LocallyAbortOperationThatFailsToResolveOverload-> CompleteD
1969+ | res->
1970+ match csenv.eContextInfowith
1971+ | ContextInfo.RuntimeTypeTest isOperator->
1972+ // test if we can cast other way around
19661973match CollectThenUndo( fun newTrace -> SolveTypSubsumesTypKeepAbbrevs csenv ndeep m( OptionalTrace.WithTrace newTrace) cxsln ty2 ty1) with
19671974| OkResult_ -> ErrorD( ErrorsFromAddingSubsumptionConstraint( csenv.g, csenv.DisplayEnv, ty1, ty2, res, ContextInfo.DowncastUsedInsteadOfUpcast isOperator, m))
19681975| _ -> ErrorD( ErrorsFromAddingSubsumptionConstraint( csenv.g, csenv.DisplayEnv, ty1, ty2, res, ContextInfo.NoContext, m))
19691976| _ -> ErrorD( ErrorsFromAddingSubsumptionConstraint( csenv.g, csenv.DisplayEnv, ty1, ty2, res, csenv.eContextInfo, m)))
19701977
19711978and private SolveTypEqualsTypWithReport ( csenv : ConstraintSolverEnv ) ndeep m trace cxsln ty1 ty2 =
19721979 TryD( fun () -> SolveTypEqualsTypKeepAbbrevsWithCxsln csenv ndeep m trace cxsln ty1 ty2)
1973- ( fun res -> ErrorD( ErrorFromAddingTypeEquation( csenv.g, csenv.DisplayEnv, ty1, ty2, res, m)))
1980+ ( function
1981+ | LocallyAbortOperationThatFailsToResolveOverload-> CompleteD
1982+ | res-> ErrorD( ErrorFromAddingTypeEquation( csenv.g, csenv.DisplayEnv, ty1, ty2, res, m)))
19741983
19751984and ArgsMustSubsumeOrConvert
19761985( csenv : ConstraintSolverEnv )
@@ -2536,7 +2545,7 @@ let AddCxTypeMustSubsumeType contextInfo denv css m trace ty1 ty2 =
25362545|> RaiseOperationResult
25372546
25382547let AddCxMethodConstraint denv css m trace traitInfo =
2539- TryD( fun () -> SolveMemberConstraint( MakeConstraintSolverEnv ContextInfo.NoContext css m denv) false 0 m trace traitInfo++ ( fun _ -> CompleteD))
2548+ TryD( fun () -> SolveMemberConstraint( MakeConstraintSolverEnv ContextInfo.NoContext css m denv) true false 0 m trace traitInfo++ ( fun _ -> CompleteD))
25402549( fun res -> ErrorD( ErrorFromAddingConstraint( denv, res, m)))
25412550|> RaiseOperationResult
25422551
@@ -2594,7 +2603,7 @@ let CodegenWitnessThatTypSupportsTraitConstraint tcVal g amap m (traitInfo:Trait
25942603 InfoReader= new InfoReader( g, amap) }
25952604
25962605let csenv = MakeConstraintSolverEnv ContextInfo.NoContext css m( DisplayEnv.Empty g)
2597- SolveMemberConstraint csenvtrue 0 m NoTrace traitInfo++ ( fun _res ->
2606+ SolveMemberConstraint csenvtrue true 0 m NoTrace traitInfo++ ( fun _res ->
25982607let sln =
25992608match traitInfo.Solutionwith
26002609| None-> Choice4Of4()
@@ -2719,4 +2728,5 @@ let IsApplicableMethApprox g amap m (minfo:MethInfo) availObjTy =
27192728|> CommitOperationResult
27202729| _ -> true
27212730else
2722- true
2731+ true
2732+