Skip to content

Commit 390c904

Browse files
committed
Revert "Revert dotnet#1650 (and dotnet#3366) (dotnet#4173)"
This reverts commit f9893b6.
1 parent 02296e2 commit 390c904

File tree

5 files changed

+36
-92
lines changed

5 files changed

+36
-92
lines changed

src/fsharp/ConstraintSolver.fs

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,7 @@ let ShowAccessDomain ad =
370370
// Solve
371371

372372
exception NonRigidTypar of DisplayEnv * string option * range * TType * TType * range
373+
exception LocallyAbortOperationThatFailsToResolveOverload
373374
exception LocallyAbortOperationThatLosesAbbrevs
374375
let 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 csenv false ndeep m2 trace traitInfo ++ (fun _ -> CompleteD)
753+
| TyparConstraint.MayResolveMember(traitInfo, m2) ->
754+
SolveMemberConstraint csenv false false ndeep m2 trace traitInfo ++ (fun _ -> CompleteD)
754755
)))
755756

756757

@@ -760,14 +761,15 @@ and SolveTypEqualsTyp (csenv:ConstraintSolverEnv) ndeep m2 (trace: OptionalTrace
760761
let ndeep = ndeep + 1
761762
let aenv = csenv.EquivEnv
762763
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+
771773
let canShortcut = not trace.HasTrace
772774
let sty1 = stripTyEqnsA csenv.g canShortcut ty1
773775
let 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
946948
if sln.Value.IsSome then ResultD true else
947949
let g = csenv.g
@@ -1298,9 +1300,12 @@ and SolveMemberConstraint (csenv:ConstraintSolverEnv) permitWeakResolution ndeep
12981300
let frees = GetFreeTyparsOfMemberConstraint csenv traitInfo
12991301

13001302
// 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)
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) ->
14441449
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)
14461451

14471452
and CanonicalizeRelevantMemberConstraints (csenv:ConstraintSolverEnv) ndeep trace tps =
14481453
SolveRelevantMemberConstraints csenv ndeep true trace tps
@@ -1957,18 +1962,22 @@ and CanMemberSigsMatchUpToCheck
19571962
// to allow us to report the outer types involved in the constraint
19581963
and 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.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
19641971
match 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

19691976
and 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

19731982
and ArgsMustSubsumeOrConvert
19741983
(csenv:ConstraintSolverEnv)
@@ -2534,7 +2543,7 @@ let AddCxTypeMustSubsumeType contextInfo denv css m trace ty1 ty2 =
25342543
|> RaiseOperationResult
25352544

25362545
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))
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

25942603
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 ->
25962605
let sln =
25972606
match traitInfo.Solution with
25982607
| None -> Choice4Of4()
@@ -2717,4 +2726,5 @@ let IsApplicableMethApprox g amap m (minfo:MethInfo) availObjTy =
27172726
|> CommitOperationResult
27182727
| _ -> true
27192728
else
2720-
true
2729+
true
2730+

tests/fsharpqa/Source/Conformance/DeclarationElements/MemberDefinitions/OverloadingMembers/OverloadsAndSRTPs01.fs

Lines changed: 0 additions & 38 deletions
This file was deleted.

tests/fsharpqa/Source/Conformance/DeclarationElements/MemberDefinitions/OverloadingMembers/RecursiveOverload01.fs

Lines changed: 0 additions & 26 deletions
This file was deleted.

tests/fsharpqa/Source/Conformance/DeclarationElements/MemberDefinitions/OverloadingMembers/SlowOverloadResolution.fs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// #Conformance #DeclarationElements #MemberDefinitions #Overloading
22
// https://github.com/Microsoft/visualfsharp/issues/351 - slow overlaod resolution
3-
//<Expects id="FS0001" status="error">No overloads match</Expects>
3+
//<Expects id="FS0003" status="error">This value is not a function and cannot be applied</Expects>
44
type Switcher = Switcher
55

66
let inline checker< ^s, ^r when (^s or ^r) : (static member pass : ^r -> unit)> (s : ^s) (r : ^r) = ()
@@ -22,4 +22,4 @@ let main argv =
2222
let res : unit = format () "text" 5 "more text" ()
2323
printfn "%A" res
2424
System.Console.ReadKey()
25-
0 // return an integer exit code
25+
0 // return an integer exit code

tests/fsharpqa/Source/Conformance/DeclarationElements/MemberDefinitions/OverloadingMembers/env.lst

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ NOMONO,NoMT SOURCE=ConsumeOverloadGenericMethods.fs SCFLAGS="-r:lib.dll" PRECMD=
2727
SOURCE=InferenceForLambdaArgs.fs # InferenceForLambdaArgs.fs
2828

2929
SOURCE=SlowOverloadResolution.fs # SlowOverloadResolution.fs
30-
SOURCE=RecursiveOverload01.fs # RecursiveOverload01.fs
31-
SOURCE=OverloadsAndSRTPs01.fs # OverloadsAndSRTPs01.fs
3230

3331
SOURCE=E_OverloadCurriedFunc.fs # E_OverloadCurriedFunc.fs
3432
SOURCE=NoWarningWhenOverloadingInSubClass01.fs SCFLAGS="--warnaserror" # NoWarningWhenOverloadingInSubClass01.fs

0 commit comments

Comments
 (0)