Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion eng/Versions.props
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
<!-- F# Version components -->
<FSMajorVersion>8</FSMajorVersion>
<FSMinorVersion>0</FSMinorVersion>
<FSBuildVersion>401</FSBuildVersion>
<FSBuildVersion>402</FSBuildVersion>
<FSRevisionVersion>0</FSRevisionVersion>
<!-- -->
<!-- F# Language version -->
Expand Down
21 changes: 9 additions & 12 deletions src/Compiler/Checking/AugmentWithHashCompare.fs
Original file line number Diff line number Diff line change
Expand Up @@ -1322,7 +1322,7 @@ let MakeValsForCompareWithComparerAugmentation g (tcref: TyconRef) =
let MakeValsForEqualsAugmentation g (tcref: TyconRef) =
let m = tcref.Range
let _, ty = mkMinimalTy g tcref
let vis = tcref.TypeReprAccessibility
let vis = tcref.Accessibility
let tps = tcref.Typars m

let objEqualsVal =
Expand All @@ -1347,16 +1347,13 @@ let MakeValsForEqualsAugmentation g (tcref: TyconRef) =

let MakeValsForEqualityWithComparerAugmentation g (tcref: TyconRef) =
let _, ty = mkMinimalTy g tcref
let vis =
// Equality method for union types match the union type visibility rather than the TypeReprAccessibility
if tcref.IsUnionTycon then tcref.Accessibility
else tcref.TypeReprAccessibility
let vis = tcref.Accessibility
let tps = tcref.Typars tcref.Range

let objGetHashCodeVal =
mkValSpec g tcref ty vis (Some(mkGetHashCodeSlotSig g)) "GetHashCode" (tps +-> (mkHashTy g ty)) unitArg false

let withcGetHashCodeVal =
let withGetHashCodeVal =
mkValSpec
g
tcref
Expand All @@ -1368,10 +1365,11 @@ let MakeValsForEqualityWithComparerAugmentation g (tcref: TyconRef) =
unaryArg
false

let withcEqualsVal =
let withEqualsVal =
mkValSpec g tcref ty vis (Some(mkIStructuralEquatableEqualsSlotSig g)) "Equals" (tps +-> (mkEqualsWithComparerTy g ty)) tupArg false

let withcEqualsValExact =
let withEqualsExactWithComparer =
let vis = TAccess (updateSyntaxAccessForCompPath (vis.CompilationPaths) SyntaxAccess.Public)
mkValSpec
g
tcref
Expand All @@ -1383,12 +1381,11 @@ let MakeValsForEqualityWithComparerAugmentation g (tcref: TyconRef) =
(tps +-> (mkEqualsWithComparerTyExact g ty))
tupArg
false

{
GetHashCode = objGetHashCodeVal
GetHashCodeWithComparer = withcGetHashCodeVal
EqualsWithComparer = withcEqualsVal
EqualsExactWithComparer = withcEqualsValExact
GetHashCodeWithComparer = withGetHashCodeVal
EqualsWithComparer = withEqualsVal
EqualsExactWithComparer = withEqualsExactWithComparer
}

let MakeBindingsForCompareAugmentation g (tycon: Tycon) =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -769,9 +769,7 @@ let main _ =
|> shouldSucceed
|> verifyIL [
"""
.method public specialname static class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`2<class [FSharp.Core]Microsoft.FSharp.Core.Unit,class [FSharp.Core]Microsoft.FSharp.Core.Unit>
'|IsEqual|IsNonEqual|'<(class [Potato]Potato.Lib/IPotato`1<!!T>) T>(!!T x,
!!T y) cil managed
.method public specialname static class [FSharp.Core]Microsoft.FSharp.Core.FSharpChoice`2<class [FSharp.Core]Microsoft.FSharp.Core.Unit,class [FSharp.Core]Microsoft.FSharp.Core.Unit> '|IsEqual|IsNonEqual|'<(class [Potato]Potato.Lib/IPotato`1<!!T>) T>(!!T x, !!T y) cil managed
{

.maxstack 8
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -877,8 +877,7 @@ let main args =
IL_0002: newobj instance void Foo/StructUnion::.ctor(int32)
IL_0007: ret
}""";(*This is a 'maker method' New{CaseName} used for cases which do have fields associated with them, + the _tag gets initialized*)"""
NewCase3(string _field1_3,
string _field2_3) cil managed
NewCase3(string _field1_3, string _field2_3) cil managed
{
.custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags,
int32) = ( 01 00 08 00 00 00 02 00 00 00 00 00 )
Expand Down
16 changes: 4 additions & 12 deletions tests/FSharp.Compiler.ComponentTests/EmittedIL/ByRefTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -283,9 +283,7 @@ type C() =
.get instance int32& modreq([runtime]System.Runtime.InteropServices.InAttribute) Test/C::get_X()
}"""

let verifyMethod = """.method public hidebysig specialname
instance int32& modreq([runtime]System.Runtime.InteropServices.InAttribute)
get_X() cil managed
let verifyMethod = """.method public hidebysig specialname instance int32& modreq([runtime]System.Runtime.InteropServices.InAttribute) get_X() cil managed
{
.param [0]
.custom instance void [runtime]System.Runtime.CompilerServices.IsReadOnlyAttribute::.ctor() = ( 01 00 00 00 )"""
Expand Down Expand Up @@ -313,9 +311,7 @@ type C() =
.get instance int32& modreq([netstandard]System.Runtime.InteropServices.InAttribute) Test/C::get_X()
}"""

let verifyMethod = """.method public hidebysig specialname
instance int32& modreq([netstandard]System.Runtime.InteropServices.InAttribute)
get_X() cil managed
let verifyMethod = """.method public hidebysig specialname instance int32& modreq([netstandard]System.Runtime.InteropServices.InAttribute) get_X() cil managed
{
.param [0]
.custom instance void System.Runtime.CompilerServices.IsReadOnlyAttribute::.ctor() = ( 01 00 00 00 )"""
Expand Down Expand Up @@ -452,9 +448,7 @@ type C<'T>() =
abstract X<'U> : unit -> inref<'U>
"""

let verifyMethod = """.method public hidebysig abstract virtual
instance !!U& modreq([runtime]System.Runtime.InteropServices.InAttribute)
X<U>() cil managed
let verifyMethod = """.method public hidebysig abstract virtual instance !!U& modreq([runtime]System.Runtime.InteropServices.InAttribute) X<U>() cil managed
{
.param [0]
.custom instance void [runtime]System.Runtime.CompilerServices.IsReadOnlyAttribute::.ctor() = ( 01 00 00 00 )"""
Expand All @@ -481,9 +475,7 @@ type C =
.get instance int32& modreq([runtime]System.Runtime.InteropServices.InAttribute) Test/C::get_X()
}"""

let verifyMethod = """.method public hidebysig specialname abstract virtual
instance int32& modreq([runtime]System.Runtime.InteropServices.InAttribute)
get_X() cil managed
let verifyMethod = """.method public hidebysig specialname abstract virtual instance int32& modreq([runtime]System.Runtime.InteropServices.InAttribute) get_X() cil managed
{
.param [0]
.custom instance void [runtime]System.Runtime.CompilerServices.IsReadOnlyAttribute::.ctor() = ( 01 00 00 00 )"""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -146,3 +146,59 @@ type ILArrayShape =
]
|> shouldSucceed

[<InlineData(true, "public")>] // RealSig
[<InlineData(false, "assembly")>] // Regular
[<Theory>]
let ``private DU in module`` (realSig, expected) =
FSharp """
module RealInternalSignature
module Module =
type private DU = ABC | YYZ

let publicFunction () : bool =
ABC = YYZ

Module.publicFunction () |> printfn "%b"
"""
|> asExe
|> withRealInternalSignature realSig
|> compileAndRun
|> withILContains [
$$"""
.method {{expected}} hidebysig instance bool Equals(class RealInternalSignature/Module/DU obj, class [runtime]System.Collections.IEqualityComparer comp) cil managed
{
.custom instance void [runtime]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )

.maxstack 4
.locals init (int32 V_0,
int32 V_1)
IL_0000: ldarg.0
IL_0001: brfalse.s IL_001b

IL_0003: ldarg.1
IL_0004: brfalse.s IL_0019

IL_0006: ldarg.0
IL_0007: ldfld int32 RealInternalSignature/Module/DU::_tag
IL_000c: stloc.0
IL_000d: ldarg.1
IL_000e: ldfld int32 RealInternalSignature/Module/DU::_tag
IL_0013: stloc.1
IL_0014: ldloc.0
IL_0015: ldloc.1
IL_0016: ceq
IL_0018: ret

IL_0019: ldc.i4.0
IL_001a: ret

IL_001b: ldarg.1
IL_001c: ldnull
IL_001d: cgt.un
IL_001f: ldc.i4.0
IL_0020: ceq
IL_0022: ret
}
"""
]
|> shouldSucceed
Loading
Loading