Skip to content

Commit 981ac6e

Browse files
authored
VB: EmitDelegateCreation - account for the fact that static methods can be marked virtual in metadata (#79697)
Fixes #79696
1 parent b10ed1a commit 981ac6e

File tree

3 files changed

+52
-1
lines changed

3 files changed

+52
-1
lines changed

src/Compilers/VisualBasic/Portable/CodeGen/EmitExpression.vb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGen
490490
' Delegates shall be declared sealed.
491491
' The Invoke method shall be virtual.
492492
' Dev11 VB uses ldvirtftn for delegate methods, we emit ldftn to be consistent with C#.
493-
If method.IsMetadataVirtual AndAlso Not method.ContainingType.IsDelegateType() AndAlso Not receiver.SuppressVirtualCalls Then
493+
If Not method.IsShared AndAlso method.IsMetadataVirtual AndAlso Not method.ContainingType.IsDelegateType() AndAlso Not receiver.SuppressVirtualCalls Then
494494
_builder.EmitOpCode(ILOpCode.Dup)
495495
_builder.EmitOpCode(ILOpCode.Ldvirtftn)
496496
Else

src/Compilers/VisualBasic/Test/Emit/CodeGen/CodeGenDelegateCreation.vb

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2959,5 +2959,55 @@ End Module
29592959
CompileAndVerify(source, expectedOutput:="pass").VerifyDiagnostics()
29602960
End Sub
29612961

2962+
<Fact>
2963+
<WorkItem("https://devdiv.visualstudio.com/DevDiv/_workitems/edit/2521944")>
2964+
<WorkItem("https://github.com/dotnet/roslyn/issues/79696")>
2965+
Public Sub DoubleCreateTruncating()
2966+
Dim source =
2967+
<compilation>
2968+
<file>
2969+
Imports System
2970+
2971+
Module Program
2972+
Sub Main()
2973+
Dim b As Byte = 10
2974+
Console.Write(Test1()(b))
2975+
Console.Write(":")
2976+
Console.Write(Test2(b))
2977+
End Sub
2978+
2979+
Function Test1() As Func(Of Byte, Double)
2980+
Return AddressOf Double.CreateTruncating
2981+
End Function
2982+
2983+
Function Test2(b As Byte) As Double
2984+
Return Double.CreateTruncating(b)
2985+
End Function
2986+
End Module </file>
2987+
</compilation>
2988+
2989+
Dim comp = CreateCompilation(source, targetFramework:=TargetFramework.Net90, options:=TestOptions.ReleaseExe)
2990+
Dim verifier = CompileAndVerify(comp, expectedOutput:=If(ExecutionConditionUtil.IsMonoOrCoreClr, "10:10", Nothing), verify:=Verification.FailsPEVerify).VerifyDiagnostics()
2991+
verifier.VerifyIL("Program.Test1", <![CDATA[
2992+
{
2993+
// Code size 13 (0xd)
2994+
.maxstack 2
2995+
IL_0000: ldnull
2996+
IL_0001: ldftn "Function Double.CreateTruncating(Of Byte)(Byte) As Double"
2997+
IL_0007: newobj "Sub System.Func(Of Byte, Double)..ctor(Object, System.IntPtr)"
2998+
IL_000c: ret
2999+
}
3000+
]]>)
3001+
verifier.VerifyIL("Program.Test2", <![CDATA[
3002+
{
3003+
// Code size 7 (0x7)
3004+
.maxstack 1
3005+
IL_0000: ldarg.0
3006+
IL_0001: call "Function Double.CreateTruncating(Of Byte)(Byte) As Double"
3007+
IL_0006: ret
3008+
}
3009+
]]>)
3010+
End Sub
3011+
29623012
End Class
29633013
End Namespace

src/Compilers/VisualBasic/Test/Emit/Microsoft.CodeAnalysis.VisualBasic.Emit.UnitTests.vbproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
<ProjectReference Include="..\..\..\Test\Utilities\VisualBasic\Microsoft.CodeAnalysis.VisualBasic.Test.Utilities.vbproj" />
2121
<ProjectReference Include="..\..\Portable\Microsoft.CodeAnalysis.VisualBasic.vbproj" />
2222
<PackageReference Include="Basic.Reference.Assemblies.Net50" />
23+
<PackageReference Include="Basic.Reference.Assemblies.Net90" />
2324
</ItemGroup>
2425
<ItemGroup>
2526
<PackageReference Include="Microsoft.DiaSymReader" />

0 commit comments

Comments
 (0)