From ea026302341dbfaffe4d088d396be039c6c8c6e4 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Fri, 23 Oct 2020 09:18:26 +0200 Subject: [PATCH 1/2] Reduce number of typeEquiv checks --- src/fsharp/CheckDeclarations.fs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/fsharp/CheckDeclarations.fs b/src/fsharp/CheckDeclarations.fs index 5ec8ff9c352..7d85ce12846 100644 --- a/src/fsharp/CheckDeclarations.fs +++ b/src/fsharp/CheckDeclarations.fs @@ -2360,7 +2360,7 @@ let TcMutRecDefns_Phase2 (cenv: cenv) envInitial bindsm scopem mutRecNSInfo (env let interfacesFromTypeDefn envForTycon tyconMembersData = let (MutRecDefnsPhase2DataForTycon(_, _, declKind, tcref, _, _, declaredTyconTypars, members, _, _, _)) = tyconMembersData let overridesOK = DeclKind.CanOverrideOrImplement declKind - members |> List.collect (function + members |> List.collect (function | SynMemberDefn.Interface(ity, defnOpt, _) -> let _, ty = if tcref.Deref.IsExceptionDecl then [], g.exn_ty else generalizeTyconRef tcref let m = ity.Range @@ -2374,12 +2374,18 @@ let TcMutRecDefns_Phase2 (cenv: cenv) envInitial bindsm scopem mutRecNSInfo (env if not (tcref.HasInterface g ity') then error(Error(FSComp.SR.tcAllImplementedInterfacesShouldBeDeclared(), ity.Range)) - if (typeEquiv g ity' g.mk_IComparable_ty && Option.isSome tcref.GeneratedCompareToValues) || - (typeEquiv g ity' g.mk_IStructuralComparable_ty && Option.isSome tcref.GeneratedCompareToWithComparerValues) || - (typeEquiv g ity' ((mkAppTy g.system_GenericIComparable_tcref [ty])) && Option.isSome tcref.GeneratedCompareToValues) || - (typeEquiv g ity' ((mkAppTy g.system_GenericIEquatable_tcref [ty])) && Option.isSome tcref.GeneratedHashAndEqualsWithComparerValues) || - (typeEquiv g ity' g.mk_IStructuralEquatable_ty && Option.isSome tcref.GeneratedHashAndEqualsWithComparerValues) then + + let generatedCompareToValues = Option.isSome tcref.GeneratedCompareToValues + let generatedHashAndEqualsWithComparerValues = Option.isSome tcref.GeneratedHashAndEqualsWithComparerValues + let generatedCompareToWithComparerValues = Option.isSome tcref.GeneratedCompareToWithComparerValues + + if (generatedCompareToValues && typeEquiv g ity' g.mk_IComparable_ty) || + (generatedCompareToWithComparerValues && typeEquiv g ity' g.mk_IStructuralComparable_ty) || + (generatedCompareToValues && typeEquiv g ity' ((mkAppTy g.system_GenericIComparable_tcref [ty]))) || + (generatedHashAndEqualsWithComparerValues && typeEquiv g ity' ((mkAppTy g.system_GenericIEquatable_tcref [ty]))) || + (generatedHashAndEqualsWithComparerValues && typeEquiv g ity' g.mk_IStructuralEquatable_ty) then errorR(Error(FSComp.SR.tcDefaultImplementationForInterfaceHasAlreadyBeenAdded(), ity.Range)) + if overridesOK = WarnOnOverrides then warning(IntfImplInIntrinsicAugmentation(ity.Range)) if overridesOK = ErrorOnOverrides then From e3ce107edb87f880e1ce46dc2aebe27e35af634d Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Fri, 30 Oct 2020 14:11:47 +0100 Subject: [PATCH 2/2] Apply review feedback --- src/fsharp/CheckDeclarations.fs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/fsharp/CheckDeclarations.fs b/src/fsharp/CheckDeclarations.fs index 7d85ce12846..ace97957099 100644 --- a/src/fsharp/CheckDeclarations.fs +++ b/src/fsharp/CheckDeclarations.fs @@ -2375,9 +2375,9 @@ let TcMutRecDefns_Phase2 (cenv: cenv) envInitial bindsm scopem mutRecNSInfo (env if not (tcref.HasInterface g ity') then error(Error(FSComp.SR.tcAllImplementedInterfacesShouldBeDeclared(), ity.Range)) - let generatedCompareToValues = Option.isSome tcref.GeneratedCompareToValues - let generatedHashAndEqualsWithComparerValues = Option.isSome tcref.GeneratedHashAndEqualsWithComparerValues - let generatedCompareToWithComparerValues = Option.isSome tcref.GeneratedCompareToWithComparerValues + let generatedCompareToValues = tcref.GeneratedCompareToValues.IsSome + let generatedHashAndEqualsWithComparerValues = tcref.GeneratedHashAndEqualsWithComparerValues.IsSome + let generatedCompareToWithComparerValues = tcref.GeneratedCompareToWithComparerValues.IsSome if (generatedCompareToValues && typeEquiv g ity' g.mk_IComparable_ty) || (generatedCompareToWithComparerValues && typeEquiv g ity' g.mk_IStructuralComparable_ty) ||