@@ -370,6 +370,7 @@ let ShowAccessDomain ad =
370
370
// Solve
371
371
372
372
exception NonRigidTypar of DisplayEnv * string option * range * TType * TType * range
373
+ exception LocallyAbortOperationThatFailsToResolveOverload
373
374
exception LocallyAbortOperationThatLosesAbbrevs
374
375
let localAbortD = ErrorD LocallyAbortOperationThatLosesAbbrevs
375
376
@@ -738,19 +739,19 @@ and solveTypMeetsTyparConstraints (csenv:ConstraintSolverEnv) ndeep m2 trace ty
738
739
| Some destTypar ->
739
740
AddConstraint csenv ndeep m2 trace destTypar ( TyparConstraint.DefaultsTo( priority, dty, m))
740
741
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
745
746
| 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
750
751
| TyparConstraint.SimpleChoice( tys, m2) -> SolveTypChoice csenv ndeep m2 trace ty tys
751
752
| TyparConstraint.CoercesTo( ty2, m2) -> SolveTypSubsumesTypKeepAbbrevs csenv ndeep m2 trace None ty2 ty
752
- | TyparConstraint.MayResolveMember( traitInfo, m2) ->
753
- SolveMemberConstraint csenv false ndeep m2 trace traitInfo ++ ( fun _ -> CompleteD)
753
+ | TyparConstraint.MayResolveMember( traitInfo, m2) ->
754
+ SolveMemberConstraint csenv false false ndeep m2 trace traitInfo ++ ( fun _ -> CompleteD)
754
755
)))
755
756
756
757
@@ -760,14 +761,15 @@ and SolveTypEqualsTyp (csenv:ConstraintSolverEnv) ndeep m2 (trace: OptionalTrace
760
761
let ndeep = ndeep + 1
761
762
let aenv = csenv.EquivEnv
762
763
let g = csenv.g
763
- if ty1 === ty2 then CompleteD else
764
764
765
765
match cxsln with
766
766
| Some ( traitInfo, traitSln) when traitInfo.Solution.IsNone ->
767
767
// If this is an overload resolution at this point it's safe to assume the candidate member being evaluated solves this member constraint.
768
768
TransactMemberConstraintSolution traitInfo trace traitSln
769
769
| _ -> ()
770
770
771
+ if ty1 === ty2 then CompleteD else
772
+
771
773
let canShortcut = not trace.HasTrace
772
774
let sty1 = stripTyEqnsA csenv.g canShortcut ty1
773
775
let sty2 = stripTyEqnsA csenv.g canShortcut ty2
@@ -941,7 +943,7 @@ and SolveDimensionlessNumericType (csenv:ConstraintSolverEnv) ndeep m2 trace ty
941
943
/// We pretend int and other types support a number of operators. In the actual IL for mscorlib they
942
944
/// don't, however the type-directed static optimization rules in the library code that makes use of this
943
945
/// 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 > =
945
947
// Do not re-solve if already solved
946
948
if sln.Value.IsSome then ResultD true else
947
949
let g = csenv.g
@@ -1298,9 +1300,12 @@ and SolveMemberConstraint (csenv:ConstraintSolverEnv) permitWeakResolution ndeep
1298
1300
let frees = GetFreeTyparsOfMemberConstraint csenv traitInfo
1299
1301
1300
1302
// If there's nothing left to learn then raise the errors
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)
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)
1304
1309
)
1305
1310
++
1306
1311
( fun res -> RecordMemberConstraintSolution csenv.SolverState m trace traitInfo res))
@@ -1442,7 +1447,7 @@ and SolveRelevantMemberConstraintsForTypar (csenv:ConstraintSolverEnv) ndeep per
1442
1447
cxs
1443
1448
|> AtLeastOneD ( fun ( traitInfo , m2 ) ->
1444
1449
let csenv = { csenv with m = m2 }
1445
- SolveMemberConstraint csenv permitWeakResolution ( ndeep+ 1 ) m2 trace traitInfo)
1450
+ SolveMemberConstraint csenv true permitWeakResolution ( ndeep+ 1 ) m2 trace traitInfo)
1446
1451
1447
1452
and CanonicalizeRelevantMemberConstraints ( csenv : ConstraintSolverEnv ) ndeep trace tps =
1448
1453
SolveRelevantMemberConstraints csenv ndeep true trace tps
@@ -1957,18 +1962,22 @@ and CanMemberSigsMatchUpToCheck
1957
1962
// to allow us to report the outer types involved in the constraint
1958
1963
and private SolveTypSubsumesTypWithReport ( csenv : ConstraintSolverEnv ) ndeep m trace cxsln ty1 ty2 =
1959
1964
TryD ( fun () -> SolveTypSubsumesTypKeepAbbrevs csenv ndeep m trace cxsln ty1 ty2)
1960
- ( fun res ->
1961
- match csenv.eContextInfo with
1962
- | ContextInfo.RuntimeTypeTest isOperator ->
1963
- // test if we can cast other way around
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
1964
1971
match CollectThenUndo ( fun newTrace -> SolveTypSubsumesTypKeepAbbrevs csenv ndeep m ( OptionalTrace.WithTrace newTrace) cxsln ty2 ty1) with
1965
1972
| OkResult _ -> ErrorD ( ErrorsFromAddingSubsumptionConstraint( csenv.g, csenv.DisplayEnv, ty1, ty2, res, ContextInfo.DowncastUsedInsteadOfUpcast isOperator, m))
1966
1973
| _ -> ErrorD ( ErrorsFromAddingSubsumptionConstraint( csenv.g, csenv.DisplayEnv, ty1, ty2, res, ContextInfo.NoContext, m))
1967
1974
| _ -> ErrorD ( ErrorsFromAddingSubsumptionConstraint( csenv.g, csenv.DisplayEnv, ty1, ty2, res, csenv.eContextInfo, m)))
1968
1975
1969
1976
and private SolveTypEqualsTypWithReport ( csenv : ConstraintSolverEnv ) ndeep m trace cxsln ty1 ty2 =
1970
1977
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)))
1972
1981
1973
1982
and ArgsMustSubsumeOrConvert
1974
1983
( csenv : ConstraintSolverEnv )
@@ -2534,7 +2543,7 @@ let AddCxTypeMustSubsumeType contextInfo denv css m trace ty1 ty2 =
2534
2543
|> RaiseOperationResult
2535
2544
2536
2545
let 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))
2538
2547
( fun res -> ErrorD ( ErrorFromAddingConstraint( denv, res, m)))
2539
2548
|> RaiseOperationResult
2540
2549
@@ -2592,7 +2601,7 @@ let CodegenWitnessThatTypSupportsTraitConstraint tcVal g amap m (traitInfo:Trait
2592
2601
InfoReader = new InfoReader( g, amap) }
2593
2602
2594
2603
let csenv = MakeConstraintSolverEnv ContextInfo.NoContext css m ( DisplayEnv.Empty g)
2595
- SolveMemberConstraint csenv true 0 m NoTrace traitInfo ++ ( fun _res ->
2604
+ SolveMemberConstraint csenv true true 0 m NoTrace traitInfo ++ ( fun _res ->
2596
2605
let sln =
2597
2606
match traitInfo.Solution with
2598
2607
| None -> Choice4Of4()
@@ -2717,4 +2726,5 @@ let IsApplicableMethApprox g amap m (minfo:MethInfo) availObjTy =
2717
2726
|> CommitOperationResult
2718
2727
| _ -> true
2719
2728
else
2720
- true
2729
+ true
2730
+
0 commit comments