diff --git a/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenTests.cs b/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenTests.cs index ba6e48922cf6d40da8487eb1ff097f0a5c518ac4..00aedb211f357e9032e59e65f7879a019c551001 100644 --- a/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenTests.cs +++ b/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenTests.cs @@ -15488,5 +15488,36 @@ public static void Main(string[] args) expectedOutput: "0"); } + [Fact, WorkItem(9703, "https://github.com/dotnet/roslyn/issues/9703")] + public void IgnoredConversion() + { + string source = @" +using System; + +public class Form1 { + public class BadCompiler { + public DateTime? Value {get; set;} + } + + private BadCompiler TestObj = new BadCompiler(); + + public void IPE() { + object o; + o = TestObj.Value; + } +}"; + var compilation = CompileAndVerify(source); + compilation.VerifyIL("Form1.IPE", @" +{ + // Code size 13 (0xd) + .maxstack 1 + IL_0000: ldarg.0 + IL_0001: ldfld ""Form1.BadCompiler Form1.TestObj"" + IL_0006: callvirt ""System.DateTime? Form1.BadCompiler.Value.get"" + IL_000b: pop + IL_000c: ret +}"); + } + } } diff --git a/src/Compilers/VisualBasic/Portable/CodeGen/EmitConversion.vb b/src/Compilers/VisualBasic/Portable/CodeGen/EmitConversion.vb index 48a2903b7251903c9a505bd780625a7c4618c28e..f04d4fb7a62d81021e609070e2bd91a8548898c1 100644 --- a/src/Compilers/VisualBasic/Portable/CodeGen/EmitConversion.vb +++ b/src/Compilers/VisualBasic/Portable/CodeGen/EmitConversion.vb @@ -160,19 +160,15 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGen ElseIf typeFrom.IsNullableType Then Debug.Assert(typeTo.IsReferenceType) + EmitExpression(conversion.Operand, used:=True) + If (conversion.ConversionKind And ConversionKind.Narrowing) <> 0 Then - EmitExpression(conversion.Operand, True) EmitBox(typeFrom, conversion.Operand.Syntax) _builder.EmitOpCode(ILOpCode.Castclass) EmitSymbolToken(typeTo, conversion.Syntax) - - Else + ElseIf used Then ' boxing itself is CLR-widening, so no need to emit unused boxing - EmitExpression(conversion.Operand, used) - If used Then - EmitBox(typeFrom, conversion.Operand.Syntax) - End If - + EmitBox(typeFrom, conversion.Operand.Syntax) End If ElseIf typeTo.IsNullableType Then diff --git a/src/Compilers/VisualBasic/Test/Emit/CodeGen/CodeGenTests.vb b/src/Compilers/VisualBasic/Test/Emit/CodeGen/CodeGenTests.vb index 5db6a074782466df202492eb0bf78fa10268bb96..04dbd8072424cb0e401171608ce1c972c837747e 100644 --- a/src/Compilers/VisualBasic/Test/Emit/CodeGen/CodeGenTests.vb +++ b/src/Compilers/VisualBasic/Test/Emit/CodeGen/CodeGenTests.vb @@ -13580,5 +13580,45 @@ End Class ]]>) End Sub + + + Public Sub IgnoredConversion() + CompileAndVerify( + + +Module MainModule + Public Class Form1 + Public Class BadCompiler + Public Property Value As Date? + End Class + + Private TestObj As BadCompiler = New BadCompiler() + + Public Sub IPE() + Dim o as Object + o = TestObj.Value + End Sub + End Class + + Public Sub Main() + Dim f = new Form1 + f.IPE() + End Sub +End Module + + ). + VerifyIL("MainModule.Form1.IPE", + ) + End Sub End Class End Namespace