Skip to content

Commit 8cd8973

Browse files
authored
Fix referenceassemblygeneration for .exe files (#13963)
* Fix referenceassemblygeneration for .exe files * Tests
1 parent 0ee2932 commit 8cd8973

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

src/Compiler/AbstractIL/ilwrite.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1154,7 +1154,7 @@ let canGenMethodDef (tdef: ILTypeDef) cenv (mdef: ILMethodDef) =
11541154
| ILMemberAccess.Public -> true
11551155
// When emitting a reference assembly, do not emit methods that are private/protected/internal unless they are virtual/abstract or provide an explicit interface implementation.
11561156
| ILMemberAccess.Private | ILMemberAccess.Family | ILMemberAccess.Assembly | ILMemberAccess.FamilyOrAssembly
1157-
when mdef.IsVirtual || mdef.IsAbstract || mdef.IsNewSlot || mdef.IsFinal -> true
1157+
when mdef.IsVirtual || mdef.IsAbstract || mdef.IsNewSlot || mdef.IsFinal || mdef.IsEntryPoint -> true
11581158
// When emitting a reference assembly, only generate internal methods if the assembly contains a System.Runtime.CompilerServices.InternalsVisibleToAttribute.
11591159
| ILMemberAccess.FamilyOrAssembly | ILMemberAccess.Assembly
11601160
when cenv.hasInternalsVisibleToAttrib -> true

tests/fsharp/Compiler/CodeGen/EmittedIL/ReferenceAssemblyTests.fs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -982,4 +982,35 @@ extends [runtime]System.Object
982982
}
983983
984984
} """ ]
985+
986+
[<Test>]
987+
let ``Build .exe with --refonly ensure it produces a main in the ref assembly`` () =
988+
FSharp """module ReferenceAssembly
989+
open System
990+
991+
Console.WriteLine("Hello World!")"""
992+
|> withOptions ["--refonly"]
993+
|> withName "HasMainCheck"
994+
|> asExe
995+
|> compile
996+
|> shouldSucceed
997+
|> verifyIL [
998+
referenceAssemblyAttributeExpectedIL
999+
""".class private abstract auto ansi sealed '<StartupCode$HasMainCheck>'.$ReferenceAssembly
1000+
extends [mscorlib]System.Object
1001+
{
1002+
.method public static void main@() cil managed
1003+
{
1004+
.entrypoint
1005+
// Code size 2 (0x2)
1006+
.maxstack 8
1007+
IL_0000: ldnull
1008+
IL_0001: throw
1009+
} // end of method $ReferenceAssembly::main@
1010+
1011+
} // end of class '<StartupCode$HasMainCheck>'.$ReferenceAssembly
1012+
"""
1013+
]
1014+
|> ignore
1015+
9851016
// TODO: Add tests for internal functions, types, interfaces, abstract types (with and without IVTs), (private, internal, public) fields, properties (+ different visibility for getters and setters), events.

0 commit comments

Comments
 (0)