File: BreakingChanges.vb
Web Access
Project: src\src\Compilers\VisualBasic\Test\Emit\Microsoft.CodeAnalysis.VisualBasic.Emit.UnitTests.vbproj (Microsoft.CodeAnalysis.VisualBasic.Emit.UnitTests)
' Licensed to the .NET Foundation under one or more agreements.
' The .NET Foundation licenses this file to you under the MIT license.
' See the LICENSE file in the project root for more information.
 
Imports Microsoft.CodeAnalysis.Test.Utilities
Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Imports Microsoft.CodeAnalysis.VisualBasic.UnitTests.Emit
Imports Roslyn.Test.Utilities
 
Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests
    Public Class BreakingChanges
        Inherits BasicTestBase
 
        ' In Dev10 (and earlier), this didn't generate an error.
        <Fact, WorkItem(529599, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/529599")>
        Public Sub ParsePreprocessorEndIfInMethodBody()
            ParseAndVerify(<![CDATA[
                Module Module1
                    Sub Main()
                        #If True
                        #Endif    
                    End Sub
                End Module
            ]]>,
            <errors>
                <error id="30826"/>
            </errors>)
        End Sub
 
        ' This isn't strictly a breaking change since this used to be an error and now isn't.
        ' I am marking it because it is a language change from Dev10.
        'The Dev12 parser is able to resolve the ambiguity so xml is allowed here.
        <WorkItem(885304, "DevDiv/Personal")>
        <Fact>
        Public Sub BreakingChangeParseXmlRequiresParens()
            ParseAndVerify(<![CDATA[
                           Class Class1
                             Dim obj = New With {Key <xmlLiteral />.BaseUri}
                           End Class
                ]]>)
        End Sub
 
        <WorkItem(885416, "DevDiv/Personal")>
        <Fact>
        Public Sub ParseExpectedEOS()
            ParseAndVerify(<![CDATA[
                          Module Module1
                              Enum Test
                                [Class]
                                [GetXmlNamespace]
                              End Enum
                            Sub Main()
                               Dim t As Test
                               Select Case t
                               Case Test.Class
                               'COMPILEERROR: BC30205, " "  
                               Case Test.GetXmlNamespace _
     
                               'There must be space in between
                               End Select
                            End Sub
                          End Module
                ]]>)
        End Sub
 
        ''' Roslyn doesn't give warning BC30934 while Dev10 does (Eval ctor as no const)
        '''  but gives new warning BC42025 for accessing const field through object instance
        ''' This is an improvement in Roslyn that we are able to eval the const access through 'new object()' instance
        <WorkItem(528223, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/528223")>
        <Fact>
        Public Sub BC30934ERR_RequiredAttributeConstConversion2_1()
            Dim errs = CompilationUtils.CreateCompilationWithMscorlib40(
    <compilation>
        <file name="a.vb"><![CDATA[
Imports System
Class Test
    Const x = ""
    <Obsolete(Goo(New Test()).x)>
    Shared Function Goo(ByVal x As Object) As Test
        Return Nothing
    End Function
End Class
        ]]></file>
    </compilation>).GetDiagnostics()
            Assert.Equal(1, errs.Length)
            Assert.Equal(42025, errs(0).Code)
            Assert.Equal(DiagnosticSeverity.Warning, errs(0).Severity)
        End Sub
 
        <Fact(), WorkItem(542389, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/542389")>
        Public Sub BC30519_InferVariableAsRHSValueType()
            Dim text =
<compilation>
    <file name="a.vb">
Option Infer On
 
Imports System.Math
 
Namespace Round001
    Friend Module Math
 
        Sub Round001()
            Dim temp
            temp = CSng(1.235)
            Dim actual = Round(temp, 15)
        End Sub
    End Module
End Namespace
    </file>
</compilation>
 
            ' Not Breaking anymore - Dev11 gives NO error
            CreateCompilationWithMscorlib40AndVBRuntime(text).VerifyDiagnostics()
 
        End Sub
 
        <WorkItem(531529, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/531529")>
        <WorkItem(543241, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543241")>
        <Fact()>
        Public Sub BC42104WRN_DefAsgUseNullRef01()
            Dim errs = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(
    <compilation>
        <file name="a.vb"><![CDATA[
Imports System

Module ModuleA

    ReadOnly Property Prop As Long
        Get
            Dim a = New With { .id = Prop}
            Return a.id
       End Get
    End Property

    Sub Main()
        Console.Write(Prop)
    End Sub
End Module
        ]]></file>
    </compilation>).GetDiagnostics()
 
            ' Preserving backward compatibility: property do not warn on unassigned use
            Assert.Equal(0, errs.Length)
            'Assert.Equal(1, errs.Count)
            'Assert.Equal(42104, errs(0).Code)
            'Assert.Equal(DiagnosticSeverity.Warning, errs(0).Severity)
        End Sub
 
        <WorkItem(543241, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543241")>
        <WorkItem(531310, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/531310")>
        <Fact()>
        Public Sub BC42104WRN_DefAsgUseNullRef02()
            Dim errs = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(
    <compilation>
        <file name="a.vb"><![CDATA[
Imports System

Module ModuleA

    Function Func() As Integer
        Dim x = Func
        Func = 1
        Exit Function
    End Function

    Sub Main()
        Console.Write(Func)
    End Sub
End Module
        ]]></file>
    </compilation>).GetDiagnostics()
 
            ' Preserving backward compatibility: property do not warn on unassigned use
            Assert.Equal(0, errs.Length)
            'Assert.Equal(1, errs.Count)
            'Assert.Equal(42104, errs(0).Code)
            'Assert.Equal(DiagnosticSeverity.Warning, errs(0).Severity)
        End Sub
 
        <WorkItem(543241, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543241")>
        <Fact()>
        Public Sub BC42109WRN_DefAsgUseNullRefStr01()
            Dim errs = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(
    <compilation>
        <file name="a.vb"><![CDATA[
Imports System

Module ModuleA

    Structure STR
        Public a As String
    End Structure

    ReadOnly Property Prop As STR
        Get
            Dim a = New With { .id = Prop}
            Return a.id
       End Get
    End Property

    Sub Main()
        Console.Write(Prop)
    End Sub
End Module
        ]]></file>
    </compilation>).GetDiagnostics()
            Assert.Equal(1, errs.Length)
            Assert.Equal(42109, errs(0).Code)
            Assert.Equal(DiagnosticSeverity.Warning, errs(0).Severity)
        End Sub
 
        <WorkItem(529262, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/529262")>
        <Fact()>
        Public Sub PartialMethod_EmitNamesInProperCase()
            CompileAndVerify(
<compilation>
    <file name="a.vb">
Imports System
Imports System.Reflection
Class C
    Partial Private Shared Sub M(Of T, U)(X As T, Y As U)
    End Sub
    Private Shared Sub m(Of t, u)(x As t, y As u)
        Dim method = GetType(C).GetMethod("M", BindingFlags.Static Or BindingFlags.NonPublic)
        Console.Write(method.ToString())
        Dim params = method.GetParameters()
        Console.Write(" | {0}, {1}", params(0), params(1))
    End Sub
    Shared Sub Main(args As String())
        M(1, 2)
    End Sub
End Class
    </file>
</compilation>, expectedOutput:="Void M[T,U](T, U) | T X, U Y") 'Dev10 would emit "Void m[t,u](t, u) | t x, u y"
        End Sub
 
        <WorkItem(529261, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/529261")>
        <Fact()>
        Public Sub PartialMethod_AllowNonExecutableStatements()
            'Dev10 used to report errors for each of the three cases identified below. Roslyn doesn't.
            'This is not strictly a breaking change since we just removed some errors that we used to give before.
            CompileAndVerify(<compilation>
                                 <file name="a.vb">
Imports System
Public Module Program
    'Case1: Preprocessor directives – but no executable statements
    Private Partial Sub M1
        #If False
            Console.WriteLine()
        #End If
        #if True
        #End If
    End Sub
 
    'Case2: Comments
    Private Partial Sub M2
        'A comment
    End Sub
 
    'Case3: Preprocessor constants that impact some other code later in the file
    Private Partial Sub M3
        #Const something = True
    End Sub
 
    Sub Main()
        M1() : M2() : M3()
        #If something
            Console.WriteLine("Success")
        #End If
    End Sub
End Module
                                 </file>
                             </compilation>, expectedOutput:="Success")
        End Sub
 
        <WorkItem(543241, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543241")>
        <Fact()>
        Public Sub BC42109WRN_DefAsgUseNullRefStr02()
            Dim errs = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(
    <compilation>
        <file name="a.vb"><![CDATA[
Imports System

Module ModuleA

    Structure STR
        Public a As String
    End Structure

    Function Func() As STR
        Dim x = Func
        Func = Nothing
        Exit Function
    End Function

    Sub Main()
        Console.Write(Func)
    End Sub
End Module
        ]]></file>
    </compilation>).GetDiagnostics()
            Assert.Equal(1, errs.Length)
            Assert.Equal(42109, errs(0).Code)
            Assert.Equal(DiagnosticSeverity.Warning, errs(0).Severity)
        End Sub
 
        <WorkItem(544500, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544500")>
        <Fact>
        Public Sub PartialConstructors()
            Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(
<compilation>
    <file name="a.vb">
Imports System
Partial Class C1(Of U, V)
    Class C1(Of T As U)
        Partial Private Sub New(x As T, y As C1(Of U), z As U, w As C1(Of U, V))
        End Sub
 
        Shared Function FactoryMethod(x As T, y As C1(Of U), z As U, w As C1(Of U, V)) As C1(Of T)
            Return New C1(Of T)(x, y, z, w)
        End Function
    End Class
End Class
 
Module Module1
    Sub Main()
        Dim e As New ArgumentException()
        Dim x = C1(Of Exception, Integer).C1(Of ArgumentException).FactoryMethod(e, Nothing, e, Nothing)
    End Sub
End Module
    </file>
    <file name="b.vb">
Imports System
Class C1(Of U, V)
    Partial Class C1(Of T As U)
        Private Sub New(x As T, y As C1(Of U), z As U, w As C1(Of U, V))
            Console.WriteLine("Success")
        End Sub
    End Class
End Class
    </file>
</compilation>)
 
            CompilationUtils.AssertTheseDeclarationDiagnostics(compilation,
<errors>
BC36969: 'Sub New' cannot be declared 'Partial'.
        Partial Private Sub New(x As T, y As C1(Of U), z As U, w As C1(Of U, V))
        ~~~~~~~
BC30269: 'Private Sub New(x As T, y As C1(Of U, V).C1(Of U), z As U, w As C1(Of U, V))' has multiple definitions with identical signatures.
        Partial Private Sub New(x As T, y As C1(Of U), z As U, w As C1(Of U, V))
                            ~~~
</errors>)
        End Sub
 
        <WorkItem(544500, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544500")>
        <Fact>
        Public Sub PartialConstructors2()
            Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(
<compilation>
    <file name="a.vb">
Imports System
Partial Class C1
    Partial Private Sub New()
    End Sub
End Class
 
Module Module1
    Sub Main()
        Dim e As New C1()
    End Sub
End Module
    </file>
</compilation>)
 
            CompilationUtils.AssertTheseDeclarationDiagnostics(compilation,
<errors>
BC36969: 'Sub New' cannot be declared 'Partial'.
    Partial Private Sub New()
    ~~~~~~~
</errors>)
        End Sub
 
        <WorkItem(528311, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/528311")>
        <Fact()>
        Public Sub TestHideBySigChangeForOverriddenMethods()
            Dim vbCompilation = CreateVisualBasicCompilation("TestHideBySigChangeForOverriddenMethods",
            <![CDATA[Imports System

Public Class Class1
    Public Sub Goo(i As Integer)
        Console.WriteLine("Class1.Goo(i As Integer)")
    End Sub
    Public Overridable Sub Goo()
        Console.WriteLine("Class1.Goo()")
    End Sub
End Class

Public Class Class2 : Inherits Class1
    Public Overrides Sub Goo()
        Console.WriteLine("Class2.Goo()")
    End Sub
End Class

Public Module Program
    Sub Main(args As String())
        Dim b As Class1 = New Class2
        b.Goo
        b.Goo(1)
        Dim d As Class2 = New Class2
        d.Goo
        d.Goo(1)
    End Sub
End Module]]>,
                compilationOptions:=New VisualBasicCompilationOptions(OutputKind.ConsoleApplication))
 
            'In Dev10 the emitted signature for overridden methods did not 
            'include the 'hidebysig' flag. In Roslyn we decided to break
            'from Dev10 and include this flag. This was discussed at the
            'VB language design meeting. See roslyn bug 7299 for more details.
            '<quote>
            ' Per VB language design meeting 10/25/2011, we agreed that Dev10
            ' is incorrect here and this is the correct behavior and we wish 
            ' to make the change. 
            ' This makes some things in late binder change behavior, but 
            ' changes sometimes fix problems and sometimes cause new ones,
            ' but we think they are unlikely to hurt people in practice.
            '</quote>
 
            'TODO: Add tests for the latebinder breaks (See Dev10 bug 850631,849009).
 
            Dim vbVerifier = CompileAndVerify(vbCompilation,
                expectedOutput:=<![CDATA[Class2.Goo()
Class1.Goo(i As Integer)
Class2.Goo()
Class1.Goo(i As Integer)
]]>,
                expectedSignatures:=
                {
                    Signature("Class2", "Goo", ".method public hidebysig strict virtual instance System.Void Goo() cil managed")
                })
 
            vbVerifier.VerifyDiagnostics()
 
            Dim csCompilation = CreateCSharpCompilation("CS",
            <![CDATA[public class Class3 : Class2
{
}

public class Program
{
    public static void Main()
    {
        Class3 d = new Class3();
        d.Goo();

        // The below line would fail to compile in Dev10 (with following error).
        // error CS1501: No overload for method 'Goo' takes 1 arguments.
        // In Roslyn this works fine.
        d.Goo(1);

        Class1 b = d;
        b.Goo();
        b.Goo(1);
    }
}]]>,
                compilationOptions:=New CSharp.CSharpCompilationOptions(OutputKind.ConsoleApplication),
                referencedCompilations:={vbCompilation})
            csCompilation.VerifyDiagnostics() 'No errors
        End Sub
 
        <Fact(), WorkItem(529471, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/529471")>
        Public Sub LiftedLogicalOperationsNoSideEffect()
            CompileAndVerify(
                <compilation>
                    <file name="a.vb">
Imports System
Module M
 
    Sub Main()
        Dim b As Boolean? = False
        Console.Write("F OrElse F=")
        If b OrElse Goo(b) Then
            Console.Write("True |")
        Else
            Console.Write("False |")
        End If
 
        b = True
        Console.Write("T AndAlso T=")
        If b AndAlso Bar(b) Then
            Console.Write("True | ")
        Else
            Console.Write("False | ")
        End If
 
        Dim bF As Boolean? = False
        Dim bT As Boolean? = True
        Console.Write("F Or F={0} | ", bF Or Goo(bF))
        Console.Write("T Or F={0} | ", bT Or Goo(bT))
        bF = False
        bT = True
        Console.Write("T And T={0} | ", bT And Bar(bT))
        Console.Write("F And T={0}", bF And Bar(bF))
 
    End Sub
 
    Function Goo(ByRef b As Boolean?) As Boolean?
        b = Not b
        Return False
    End Function
 
    Function Bar(ByRef b As Boolean?) As Boolean?
        b = Not b
        Return True
    End Function
End Module
                    </file>
                </compilation>, expectedOutput:="F OrElse F=False |T AndAlso T=True | F Or F=False | T Or F=True | T And T=True | F And T=False")
        End Sub
 
        <Fact(), WorkItem(545050, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545050")>
        Public Sub NoBC32126ERR_AddressOfNullableMethod_Static()
 
            ' Native: error BC32126: Methods of 'System.Nullable(Of T)' cannot be used as operands of the 'AddressOf' operator.
            ' Roslyn: No error
            CreateCompilationWithMscorlib40AndVBRuntime(
    <compilation>
        <file name="a.vb">
            Imports System
            Imports System.Collections.Generic
            Module M
                Sub Main()
                    Dim ef As Action(Of Integer) = AddressOf Nullable(Of Integer).op_Implicit ' it is legal to take address of static method
                End Sub
            End Module
        </file>
    </compilation>).AssertNoDiagnostics()
        End Sub
 
        <Fact(), WorkItem(529544, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/529544")>
        Public Sub TestMissingSynchronizedFlagForEvents()
            Dim comp = CreateVisualBasicCompilation("TestMissingSynchronizedFlagForEvents",
            <![CDATA[Public Class C1
    Public Event goo()
End Class]]>,
                compilationOptions:=New VisualBasicCompilationOptions(OutputKind.DynamicallyLinkedLibrary))
 
            ' In Dev11, we used to emit an additional 'synchronized' metadata flag in the signature of add_goo() and remove_goo() methods below.
 
            Dim verifier = CompileAndVerify(comp, expectedSignatures:=
            {
                Signature("C1", "add_goo", ".method [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public specialname instance System.Void add_goo(C1+gooEventHandler obj) cil managed"),
                Signature("C1", "remove_goo", ".method [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public specialname instance System.Void remove_goo(C1+gooEventHandler obj) cil managed")
            })
 
            verifier.VerifyDiagnostics()
        End Sub
 
        <Fact, WorkItem(529653, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/529653")>
        Public Sub TestExecutionOrderForHandles()
            Dim vbCompilation = CreateVisualBasicCompilation("TestExecutionOrderForHandles",
            <![CDATA[Option Strict Off
Imports System
Imports AliasedType = Base

Public Class Base
    Protected WithEvents w As AliasedType = Me
    Protected Friend Event Ev1 As Action(Of Integer)

    Friend Sub A() Handles w.Ev1
        Console.WriteLine("Base A")
    End Sub

    Friend Sub B() Handles w.Ev1
        Console.WriteLine("Base B")
    End Sub

    Friend Sub C() Handles w.Ev1
        Console.WriteLine("Base C")
    End Sub

    Friend Sub D() Handles w.Ev1
        Console.WriteLine("Base D")
    End Sub

    Friend Sub E() Handles w.Ev1
        Console.WriteLine("Base E")
    End Sub

    Friend Sub F() Handles w.Ev1
        Console.WriteLine("Base F")
    End Sub

    Overridable Sub Raise()
        RaiseEvent Ev1(1)
    End Sub
End Class

Public Module Program
    Sub Main()
        Dim x = New Base()
        x.Raise()
    End Sub
End Module]]>,
                compilationOptions:=New VisualBasicCompilationOptions(OutputKind.ConsoleApplication))
 
            'Breaking Change: Dev11 processes event handlers in a different order than Roslyn.
            'This is basically because Dev11 has no deterministic order for processing these.
            'See bug 13880 for more details.
            Dim vbVerifier = CompileAndVerify(vbCompilation,
                expectedOutput:=<![CDATA[Base A
Base B
Base C
Base D
Base E
Base F]]>)
            vbVerifier.VerifyDiagnostics()
        End Sub
 
        <Fact, WorkItem(529574, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/529574")>
        Public Sub TestCrossLanguageOptionalAndParamarrayForHandles()
            Dim csCompilation = CreateCSharpCompilation("TestCrossLanguageOptionalAndParamarrayForHandles_CS",
            <![CDATA[public class CSClass
{
    public delegate int bar(string x = "", params int[] y);
    public event bar ev;
    public void raise()
    {
        ev("hi", 1, 2, 3);
    }
}]]>,
                compilationOptions:=New Microsoft.CodeAnalysis.CSharp.CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary))
            csCompilation.VerifyDiagnostics()
            Dim vbCompilation = CreateVisualBasicCompilation("TestCrossLanguageOptionalAndParamarrayForHandles_VB",
            <![CDATA[
Public Class VBClass : Inherits CSClass
    Public WithEvents w As CSClass = New CSClass
    Function Goo(x As String) Handles w.ev, MyBase.ev, MyClass.ev
        Return 0
    End Function
    Function Goo(x As String, ParamArray y() As Integer) Handles w.ev, MyBase.ev, MyClass.ev
        Return 0
    End Function
    Function Goo2(Optional x As String = "") Handles w.ev, MyBase.ev, MyClass.ev
        Return 0
    End Function
    Function Goo2(x As String, y() As Integer) Handles w.ev, MyBase.ev, MyClass.ev
        Return 0
    End Function
End Class
Public Module Program
    Sub Main()
        Dim x = New VBClass
        x.raise()
        x.w.raise()
    End Sub
End Module]]>,
                compilationOptions:=New VisualBasicCompilationOptions(OutputKind.ConsoleApplication),
                referencedCompilations:={csCompilation})
 
            'Breaking Change: Dev11 allows above repro to compile while Roslyn reports following errors.
            'This was approved in VB LDB on 8/1/2012. See bug 13578 for more details.
            vbCompilation.VerifyDiagnostics(
                Diagnostic(ERRID.ERR_EventHandlerSignatureIncompatible2, "ev").WithArguments("Goo", "ev"),
                Diagnostic(ERRID.ERR_EventHandlerSignatureIncompatible2, "ev").WithArguments("Goo", "ev"),
                Diagnostic(ERRID.ERR_EventHandlerSignatureIncompatible2, "ev").WithArguments("Goo", "ev"),
                Diagnostic(ERRID.ERR_EventHandlerSignatureIncompatible2, "ev").WithArguments("Goo2", "ev"),
                Diagnostic(ERRID.ERR_EventHandlerSignatureIncompatible2, "ev").WithArguments("Goo2", "ev"),
                Diagnostic(ERRID.ERR_EventHandlerSignatureIncompatible2, "ev").WithArguments("Goo2", "ev"))
        End Sub
 
        <Fact, WorkItem(569036, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/569036")>
        Public Sub DifferenceInExceptionEvaluationWithRoslyn()
            CompileAndVerify(
<compilation>
    <file name="bug.vb">
Imports System
Module Module1
    Public Structure NullableRetStructure
        Public mem As Integer
        Public Shared Operator /(ByVal arg1 As NullableRetStructure, ByVal arg2 As Integer) As Short?
            Return arg1.mem / arg2
        End Operator
    End Structure
 
    Public Structure TestStruc
        Dim mem As Integer
    End Structure
 
        Public Function CheckType(Of T)(ByVal arg As T) As System.Type
            Return GetType(T)
        End Function
 
        Public Function goo_exc() As Integer
            Throw New ArgumentException
            goo_exc = 1
        End Function
 
        Public Function goo_eval_check(ByRef arg As Integer) As Integer?
            arg = arg + 1
            goo_eval_check = 1
        End Function
 
    Dim eval
 
    Sub Main()
        eval = 19
        Try
            Dim x = CheckType(goo_eval_check(eval) / goo_exc())
            Console.Write("Exception expected ")
        Catch ex As ArgumentException
            Console.Write("19:")
            Console.Write(eval)
        Catch ex As Exception
            Console.Write("Wrong Exception")
        End Try
    End Sub
End Module
    </file>
</compilation>, expectedOutput:="19:20") 'Dev11 would emit "19:19"
        End Sub
    End Class
End Namespace