@@ -15,7 +15,7 @@ open FSharp.Compiler.TypedTreeOps
1515open FSharp.Compiler .TypeHierarchy
1616
1717let mkIComparableCompareToSlotSig ( g : TcGlobals ) =
18- TSlotSig( " CompareTo" , g.mk_ IComparable_ ty, [], [], [ [ TSlotParam( Some( " obj" ), g.obj _ ty , false , false , false , []) ] ], Some g.int_ ty)
18+ TSlotSig( " CompareTo" , g.mk_ IComparable_ ty, [], [], [ [ TSlotParam( Some( " obj" ), g.obj _ ty _ withNulls , false , false , false , []) ] ], Some g.int_ ty)
1919
2020let mkGenericIComparableCompareToSlotSig ( g : TcGlobals ) ty =
2121 TSlotSig(
@@ -35,7 +35,7 @@ let mkIStructuralComparableCompareToSlotSig (g: TcGlobals) =
3535 [],
3636 [
3737 [
38- TSlotParam( None, ( mkRefTupledTy g [ g.obj _ ty ; g.IComparer_ ty ]), false , false , false , [])
38+ TSlotParam( None, ( mkRefTupledTy g [ g.obj _ ty _ withNulls ; g.IComparer_ ty ]), false , false , false , [])
3939 ]
4040 ],
4141 Some g.int_ ty
@@ -59,7 +59,7 @@ let mkIStructuralEquatableEqualsSlotSig (g: TcGlobals) =
5959 [],
6060 [
6161 [
62- TSlotParam( None, ( mkRefTupledTy g [ g.obj _ ty ; g.IEqualityComparer_ ty ]), false , false , false , [])
62+ TSlotParam( None, ( mkRefTupledTy g [ g.obj _ ty _ withNulls ; g.IEqualityComparer_ ty ]), false , false , false , [])
6363 ]
6464 ],
6565 Some g.bool_ ty
@@ -76,10 +76,10 @@ let mkIStructuralEquatableGetHashCodeSlotSig (g: TcGlobals) =
7676 )
7777
7878let mkGetHashCodeSlotSig ( g : TcGlobals ) =
79- TSlotSig( " GetHashCode" , g.obj _ ty , [], [], [ [] ], Some g.int_ ty)
79+ TSlotSig( " GetHashCode" , g.obj _ ty _ noNulls , [], [], [ [] ], Some g.int_ ty)
8080
8181let mkEqualsSlotSig ( g : TcGlobals ) =
82- TSlotSig( " Equals" , g.obj _ ty , [], [], [ [ TSlotParam( Some( " obj" ), g.obj _ ty , false , false , false , []) ] ], Some g.bool_ ty)
82+ TSlotSig( " Equals" , g.obj _ ty _ noNulls , [], [], [ [ TSlotParam( Some( " obj" ), g.obj _ ty _ withNulls , false , false , false , []) ] ], Some g.bool_ ty)
8383
8484//-------------------------------------------------------------------------
8585// Helpers associated with code-generation of comparison/hash augmentations
@@ -89,22 +89,22 @@ let mkThisTy g ty =
8989 if isStructTy g ty then mkByrefTy g ty else ty
9090
9191let mkCompareObjTy g ty =
92- mkFunTy g ( mkThisTy g ty) ( mkFunTy g g.obj _ ty g.int_ ty)
92+ mkFunTy g ( mkThisTy g ty) ( mkFunTy g g.obj _ ty _ withNulls g.int_ ty)
9393
9494let mkCompareTy g ty =
9595 mkFunTy g ( mkThisTy g ty) ( mkFunTy g ty g.int_ ty)
9696
9797let mkCompareWithComparerTy g ty =
98- mkFunTy g ( mkThisTy g ty) ( mkFunTy g ( mkRefTupledTy g [ g.obj _ ty ; g.IComparer_ ty ]) g.int_ ty)
98+ mkFunTy g ( mkThisTy g ty) ( mkFunTy g ( mkRefTupledTy g [ g.obj _ ty _ withNulls ; g.IComparer_ ty ]) g.int_ ty)
9999
100100let mkEqualsObjTy g ty =
101- mkFunTy g ( mkThisTy g ty) ( mkFunTy g g.obj _ ty g.bool_ ty)
101+ mkFunTy g ( mkThisTy g ty) ( mkFunTy g g.obj _ ty _ withNulls g.bool_ ty)
102102
103103let mkEqualsTy g ty =
104104 mkFunTy g ( mkThisTy g ty) ( mkFunTy g ty g.bool_ ty)
105105
106106let mkEqualsWithComparerTy g ty =
107- mkFunTy g ( mkThisTy g ty) ( mkFunTy g ( mkRefTupledTy g [ g.obj _ ty ; g.IEqualityComparer_ ty ]) g.bool_ ty)
107+ mkFunTy g ( mkThisTy g ty) ( mkFunTy g ( mkRefTupledTy g [ g.obj _ ty _ withNulls ; g.IEqualityComparer_ ty ]) g.bool_ ty)
108108
109109let mkHashTy g ty =
110110 mkFunTy g ( mkThisTy g ty) ( mkFunTy g g.unit_ ty g.int_ ty)
@@ -1096,7 +1096,7 @@ let CheckAugmentationAttribs isImplementation g amap (tycon: Tycon) =
10961096 hasNominalInterface g.system_ GenericIComparable_ tcref
10971097
10981098 let hasExplicitEquals =
1099- tycon.HasOverride g " Equals" [ g.obj _ ty ]
1099+ tycon.HasOverride g " Equals" [ g.obj _ ty _ ambivalent ]
11001100 || hasNominalInterface g.tcref_ System_ IStructuralEquatable
11011101
11021102 let hasExplicitGenericEquals = hasNominalInterface g.system_ GenericIEquatable_ tcref
@@ -1351,13 +1351,13 @@ let MakeBindingsForCompareAugmentation g (tycon: Tycon) =
13511351 let tinst , ty = mkMinimalTy g tcref
13521352
13531353 let thisv , thise = mkThisVar g m ty
1354- let thatobjv , thatobje = mkCompGenLocal m " obj" g.obj _ ty
1354+ let thatobjv , thatobje = mkCompGenLocal m " obj" g.obj _ ty _ ambivalent
13551355
13561356 let comparee =
13571357 if isUnitTy g ty then
13581358 mkZero g m
13591359 else
1360- let thate = mkCoerceExpr ( thatobje, ty, m, g.obj _ ty )
1360+ let thate = mkCoerceExpr ( thatobje, ty, m, g.obj _ ty _ ambivalent )
13611361
13621362 mkApps g (( exprForValRef m vref2, vref2.Type), ( if isNil tinst then [] else [ tinst ]), [ thise; thate ], m)
13631363
@@ -1394,8 +1394,8 @@ let MakeBindingsForCompareWithComparerAugmentation g (tycon: Tycon) =
13941394 let compv , compe = mkCompGenLocal m " comp" g.IComparer_ ty
13951395
13961396 let thisv , thise = mkThisVar g m ty
1397- let thatobjv , thatobje = mkCompGenLocal m " obj" g.obj _ ty
1398- let thate = mkCoerceExpr ( thatobje, ty, m, g.obj _ ty )
1397+ let thatobjv , thatobje = mkCompGenLocal m " obj" g.obj _ ty _ ambivalent
1398+ let thate = mkCoerceExpr ( thatobje, ty, m, g.obj _ ty _ ambivalent )
13991399
14001400 let rhs =
14011401 let comparee = comparef g tcref tycon ( thisv, thise) ( thatobjv, thate) compe
@@ -1453,7 +1453,7 @@ let MakeBindingsForEqualityWithComparerAugmentation (g: TcGlobals) (tycon: Tycon
14531453 let withcEqualsExpr =
14541454 let _tinst , ty = mkMinimalTy g tcref
14551455 let thisv , thise = mkThisVar g m ty
1456- let thatobjv , thatobje = mkCompGenLocal m " obj" g.obj _ ty
1456+ let thatobjv , thatobje = mkCompGenLocal m " obj" g.obj _ ty _ ambivalent
14571457 let thatv , thate = mkCompGenLocal m " that" ty
14581458 let compv , compe = mkCompGenLocal m " comp" g.IEqualityComparer_ ty
14591459 let equalse = equalsf g tcref tycon ( thisv, thise) thatobje ( thatv, thate) compe
@@ -1515,7 +1515,7 @@ let MakeBindingsForEqualsAugmentation (g: TcGlobals) (tycon: Tycon) =
15151515 let tinst , ty = mkMinimalTy g tcref
15161516
15171517 let thisv , thise = mkThisVar g m ty
1518- let thatobjv , thatobje = mkCompGenLocal m " obj" g.obj _ ty
1518+ let thatobjv , thatobje = mkCompGenLocal m " obj" g.obj _ ty _ ambivalent
15191519
15201520 let equalse =
15211521 if isUnitTy g ty then
0 commit comments