File: Semantics\MethodCalls.vb
Web Access
Project: src\src\Compilers\VisualBasic\Test\Semantic\Microsoft.CodeAnalysis.VisualBasic.Semantic.UnitTests.vbproj (Microsoft.CodeAnalysis.VisualBasic.Semantic.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.VisualBasic.Syntax
Imports Microsoft.CodeAnalysis.Test.Utilities
Imports Roslyn.Test.Utilities
Imports Basic.Reference.Assemblies
 
Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests.Semantics
 
    Public Class MethodCalls
        Inherits BasicTestBase
 
        <Fact>
        Public Sub NamedArguments()
            Dim compilationDef =
<compilation name="VBNamedArguments1">
    <file name="a.vb">
Option Strict Off
 
Imports System
 
Module Module1
 
    Sub Main()
 
        TestOrder2(b:=TestOrder1(1), a:=TestOrder1(2))
        TestOrder2(a:=TestOrder1(3), b:=TestOrder1(4))
        TestOrder2(b:=TestOrder3("5"), a:=TestOrder1(6))
        TestOrder2(b:=TestOrder1(7), a:=TestOrder3("8"))
        TestOrder2(b:=TestOrder3("9"), a:=TestOrder3("10"))
        TestOrder2(a:=TestOrder3("11"), b:=TestOrder3("12"))
    End Sub
 
 
    Sub TestOrder2(a As Integer, b As Integer)
        System.Console.WriteLine("TestOrder2: {0}, {1}", a, b)
    End Sub
 
    Function TestOrder1(a As Integer) As Integer
        System.Console.WriteLine("TestOrder1: {0}", a)
        Return a
    End Function
 
    Function TestOrder3(a As String) As String
        System.Console.WriteLine("TestOrder3: {0}", a)
        Return a
    End Function
End Module
    </file>
</compilation>
 
            CompileAndVerify(compilationDef,
                             expectedOutput:=
            <![CDATA[
TestOrder1: 2
TestOrder1: 1
TestOrder2: 2, 1
TestOrder1: 3
TestOrder1: 4
TestOrder2: 3, 4
TestOrder1: 6
TestOrder3: 5
TestOrder2: 6, 5
TestOrder3: 8
TestOrder1: 7
TestOrder2: 8, 7
TestOrder3: 10
TestOrder3: 9
TestOrder2: 10, 9
TestOrder3: 11
TestOrder3: 12
TestOrder2: 11, 12
]]>)
        End Sub
 
        <Fact>
        Public Sub TrueByRefArguments1()
            Dim compilationDef =
<compilation name="VBTrueByRefArguments1">
    <file name="a.vb">
Option Strict Off
 
Imports System
 
Module Module1
 
    Sub Main()
 
        Dim x As Integer = 1
        Dim z As Integer() = New Integer() {0, 3}
 
        System.Console.WriteLine("---")
        TestByRef(x)
        System.Console.WriteLine("Test1: {0}", x)
 
        System.Console.WriteLine("---")
        TestByRef(z(Return1()))
        System.Console.WriteLine("Test3: {0}", z(1))
 
        System.Console.WriteLine("---")
        TestByRef(ReturnArray(z)(Return1()))
        System.Console.WriteLine("Test4: {0}", z(1))
    End Sub
 
 
    Sub TestByRef(ByRef a As Integer)
        a = a + 1
    End Sub
 
    Function ReturnArray(z As Integer()) As Integer()
        System.Console.WriteLine("ReturnArray")
        Return z
    End Function
 
    Function Return1() As Integer
        System.Console.WriteLine("Return1")
        Return 1
    End Function
 
End Module
    </file>
</compilation>
 
            CompileAndVerify(compilationDef,
                             expectedOutput:=
            <![CDATA[
---
Test1: 2
---
Return1
Test3: 4
---
ReturnArray
Return1
Test4: 5
]]>)
        End Sub
 
        <Fact>
        Public Sub ParamArray1()
            Dim compilationDef =
<compilation name="VBParamArray1">
    <file name="a.vb">
Imports System
 
Module Module1
 
    Sub Main()
        ParamArray1()
        ParamArray1("a"c)
        ParamArray1("a"c, "b"c)
        ParamArray2(1)
        ParamArray2(2, "a"c)
        ParamArray2(3, "a"c, "b"c)
        ParamArray2(a:=4)
    End Sub
 
    Sub ParamArray1(ParamArray a As Char())
        System.Console.WriteLine("ParamArray1: [{0}]", CStr(a))
    End Sub
 
    Sub ParamArray2(a As Integer, ParamArray b As Char())
        System.Console.WriteLine("ParamArray1: {0}, [{1}]", a, CStr(b))
    End Sub
End Module
    </file>
</compilation>
 
            CompileAndVerify(compilationDef,
                             expectedOutput:=
            <![CDATA[
ParamArray1: []
ParamArray1: [a]
ParamArray1: [ab]
ParamArray1: 1, []
ParamArray1: 2, [a]
ParamArray1: 3, [ab]
ParamArray1: 4, []
]]>)
        End Sub
 
        <Fact>
        Public Sub ByRefArguments2()
            Dim compilationDef =
<compilation name="VBByRefArguments2">
    <file name="a.vb">
Option Strict Off
 
Imports System
 
Module Module1
 
    Dim staticFld As Byte
    ReadOnly staticReadonlyFld As Integer
 
    Sub Main()
 
        Dim z As Byte() = New Byte() {0, 81}
 
        System.Console.WriteLine("---")
        Test1()
 
        System.Console.WriteLine("---")
        System.Console.WriteLine(Test2())
        System.Console.WriteLine("---")
        Test2_1()
 
        System.Console.WriteLine("---")
        System.Console.WriteLine(Test3())
        System.Console.WriteLine("---")
        System.Console.WriteLine(Test3_1())
        System.Console.WriteLine("---")
        System.Console.WriteLine(Test3_2())
 
        System.Console.WriteLine("---")
        System.Console.WriteLine(Test4(51))
        Dim By As Byte = 53
        System.Console.WriteLine("---")
        Test4_1(By)
        System.Console.WriteLine(By)
 
        System.Console.WriteLine("---")
        staticFld = 61
        Test5()
        System.Console.WriteLine(staticFld)
 
        Dim tc As TestClass = New TestClass()
        System.Console.WriteLine("---")
        tc.instanceFld = 63
        Test5_1(tc)
        System.Console.WriteLine(tc.instanceFld)
 
        System.Console.WriteLine("---")
        Test5_2()
        System.Console.WriteLine("---")
        Test5_3(tc)
 
        Dim ts As TestStruct = New TestStruct()
        ts.instanceFld = 65
        System.Console.WriteLine("---")
        Test5_4(ts)
        System.Console.WriteLine(ts.instanceFld)
        System.Console.WriteLine("---")
        System.Console.WriteLine(Test5_5(ts))
        System.Console.WriteLine("---")
        Test5_6(ts)
        System.Console.WriteLine("---")
        Test5_7()
        System.Console.WriteLine("---")
        Test5_8()
        System.Console.WriteLine("---")
        Test5_9(tc)
        System.Console.WriteLine(tc.instanceFld)
        System.Console.WriteLine("---")
        Test5_10()
 
 
        System.Console.WriteLine("---")
        Test6(z)
        System.Console.WriteLine(z(1))
        System.Console.WriteLine("---")
        Test6_1(z)
        System.Console.WriteLine(z(1))
 
        ts.instanceFld = 91
        Dim z1 As TestStruct() = New TestStruct() {Nothing, ts}
 
        System.Console.WriteLine("---")
        Test6_2(z1)
        System.Console.WriteLine(z1(1).instanceFld)
        System.Console.WriteLine("---")
        Test6_3(z1)
        System.Console.WriteLine(z1(1).instanceFld)
 
    End Sub
 
 
    Sub Test6(z As Byte())
        TestByRef(z(1))
    End Sub
 
    Sub Test6_1(z As Byte())
        TestByRef(ReturnArray(z)(1))
    End Sub
 
    Sub Test6_2(z As TestStruct())
        TestByRef(z(Return1()).instanceFld)
    End Sub
 
    Sub Test6_3(z As TestStruct())
        TestByRef(z(1).instanceFld)
    End Sub
 
    Sub Test1()
        TestByRef(20)
    End Sub
 
    Function Test2() As Long
        Dim x As Byte = 30
        Return TestByRef2(CInt(x))
    End Function
 
    Sub Test2_1()
        Dim x As Byte = 32
        TestByRef2(CInt(x))
    End Sub
 
    Function Test3() As Byte
        Dim x As Byte = 40
        TestByRef(x)
        Return x
    End Function
 
    Function Test3_1() As Long
        Dim x As Byte = 42
        Return TestByRef2(x) + x
    End Function
 
    Function Test3_2() As Byte
        Dim x As Byte = 44
        TestByRef2(x)
        Return x
    End Function
 
    Function Test4(x As Byte) As Byte
        TestByRef(x)
        Return x
    End Function
 
    Sub Test4_1(ByRef x As Byte)
        TestByRef(x)
    End Sub
 
    Sub Test5()
        TestByRef(staticFld)
    End Sub
 
    Sub Test5_1(x As TestClass)
        TestByRef(x.instanceFld)
    End Sub
 
    Sub Test5_2()
        TestByRef(staticReadonlyFld)
    End Sub
 
    Sub Test5_3(x As TestClass)
        TestByRef(x.instanceReadonlyFld)
    End Sub
 
    Sub Test5_4(ByRef x As TestStruct)
        TestByRef(x.instanceFld)
    End Sub
 
    Function Test5_5(x As TestStruct) As Byte
        TestByRef(x.instanceFld)
        Return x.instanceFld
    End Function
 
    Sub Test5_6(x As TestStruct)
        TestByRef(x.instanceReadonlyFld)
    End Sub
 
    Sub Test5_7()
        TestByRef(ReturnInteger())
    End Sub
 
    Sub Test5_8()
        TestByRef(ReturnTestStruct().instanceFld2)
    End Sub
 
    Sub Test5_9(x As TestClass)
        TestByRef(ReturnTestClass(x).instanceFld)
    End Sub
 
    Sub Test5_10()
        TestByRef(1)
    End Sub
 
    Function ReturnInteger() As Integer
        Return 71
    End Function
 
    Function ReturnTestStruct() As TestStruct
        Dim x As TestStruct = New TestStruct()
        x.instanceFld2 = 73
        Return x
    End Function
 
    Function ReturnTestClass(x As TestClass) As TestClass
        Return x
    End Function
 
    Sub TestByRef(ByRef a As Integer)
        System.Console.WriteLine("TestByRef: {0}", a)
        a = a + 1
    End Sub
 
    Function TestByRef2(ByRef a As Integer) As Long
        System.Console.WriteLine("TestByRef2: {0}", a)
        a = a + 1
        Return a
    End Function
 
    Function ReturnArray(z As Byte()) As Byte()
        System.Console.WriteLine("ReturnArray")
        Return z
    End Function
 
    Function Return1() As Integer
        System.Console.WriteLine("Return1")
        Return 1
    End Function
 
End Module
 
 
Class TestClass
    Public instanceFld As Byte
    Public ReadOnly instanceReadonlyFld As Integer
 
End Class
 
 
Structure TestStruct
    Public instanceFld As Byte
    Public ReadOnly instanceReadonlyFld As Integer
    Public instanceFld2 As Integer
 
    Sub Test1()
        TestByRef(Me.instanceFld)
    End Sub
 
    Sub Test2()
        TestByRef(instanceFld)
    End Sub
 
    Sub Test3()
        TestByRef(Me.instanceReadonlyFld)
    End Sub
 
End Structure
    </file>
</compilation>
 
            Dim verifier = CompileAndVerify(compilationDef,
                             expectedOutput:=
            <![CDATA[
---
TestByRef: 20
---
TestByRef2: 30
31
---
TestByRef2: 32
---
TestByRef: 40
41
---
TestByRef2: 42
86
---
TestByRef2: 44
45
---
TestByRef: 51
52
---
TestByRef: 53
54
---
TestByRef: 61
62
---
TestByRef: 63
64
---
TestByRef: 0
---
TestByRef: 0
---
TestByRef: 65
66
---
TestByRef: 66
67
---
TestByRef: 0
---
TestByRef: 71
---
TestByRef: 73
---
TestByRef: 64
65
---
TestByRef: 1
---
TestByRef: 81
82
---
ReturnArray
TestByRef: 82
83
---
Return1
TestByRef: 91
92
---
TestByRef: 92
93
]]>)
 
            verifier.VerifyIL("Module1.Test1",
            <![CDATA[
{
  // Code size       11 (0xb)
  .maxstack  1
  .locals init (Integer V_0)
  IL_0000:  ldc.i4.s   20
  IL_0002:  stloc.0   
  IL_0003:  ldloca.s   V_0
  IL_0005:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_000a:  ret       
}
]]>)
 
            verifier.VerifyIL("Module1.Test2",
            <![CDATA[
{
  // Code size       11 (0xb)
  .maxstack  1
  .locals init (Integer V_0)
  IL_0000:  ldc.i4.s   30
  IL_0002:  stloc.0
  IL_0003:  ldloca.s   V_0
  IL_0005:  call       "Function Module1.TestByRef2(ByRef Integer) As Long"
  IL_000a:  ret
}
]]>)
 
            verifier.VerifyIL("Module1.Test2_1",
            <![CDATA[
{
  // Code size       12 (0xc)
  .maxstack  1
  .locals init (Integer V_0)
  IL_0000:  ldc.i4.s   32
  IL_0002:  stloc.0
  IL_0003:  ldloca.s   V_0
  IL_0005:  call       "Function Module1.TestByRef2(ByRef Integer) As Long"
  IL_000a:  pop
  IL_000b:  ret
}
]]>)
 
            verifier.VerifyIL("Module1.Test3",
            <![CDATA[
{
  // Code size       13 (0xd)
  .maxstack  1
  .locals init (Integer V_0)
  IL_0000:  ldc.i4.s   40
  IL_0002:  stloc.0
  IL_0003:  ldloca.s   V_0
  IL_0005:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_000a:  ldloc.0
  IL_000b:  conv.ovf.u1
  IL_000c:  ret
}
]]>)
 
            verifier.VerifyIL("Module1.Test3_1",
            <![CDATA[
{
  // Code size       19 (0x13)
  .maxstack  2
  .locals init (Byte V_0, //x
  Integer V_1)
  IL_0000:  ldc.i4.s   42
  IL_0002:  stloc.0
  IL_0003:  ldloc.0
  IL_0004:  stloc.1
  IL_0005:  ldloca.s   V_1
  IL_0007:  call       "Function Module1.TestByRef2(ByRef Integer) As Long"
  IL_000c:  ldloc.1
  IL_000d:  conv.ovf.u1
  IL_000e:  stloc.0
  IL_000f:  ldloc.0
  IL_0010:  conv.u8
  IL_0011:  add.ovf
  IL_0012:  ret
}
]]>)
 
            verifier.VerifyIL("Module1.Test3_2",
            <![CDATA[
{
  // Code size       14 (0xe)
  .maxstack  1
  .locals init (Integer V_0)
  IL_0000:  ldc.i4.s   44
  IL_0002:  stloc.0
  IL_0003:  ldloca.s   V_0
  IL_0005:  call       "Function Module1.TestByRef2(ByRef Integer) As Long"
  IL_000a:  pop
  IL_000b:  ldloc.0
  IL_000c:  conv.ovf.u1
  IL_000d:  ret
}
]]>)
 
            verifier.VerifyIL("Module1.Test4",
            <![CDATA[
{
  // Code size       15 (0xf)
  .maxstack  1
  .locals init (Integer V_0)
  IL_0000:  ldarg.0
  IL_0001:  stloc.0
  IL_0002:  ldloca.s   V_0
  IL_0004:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_0009:  ldloc.0
  IL_000a:  conv.ovf.u1
  IL_000b:  starg.s    V_0
  IL_000d:  ldarg.0
  IL_000e:  ret
}
]]>)
 
            verifier.VerifyIL("Module1.Test4_1",
            <![CDATA[
{
  // Code size       15 (0xf)
  .maxstack  2
  .locals init (Integer V_0)
  IL_0000:  ldarg.0   
  IL_0001:  ldind.u1  
  IL_0002:  stloc.0   
  IL_0003:  ldloca.s   V_0
  IL_0005:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_000a:  ldarg.0   
  IL_000b:  ldloc.0   
  IL_000c:  conv.ovf.u1
  IL_000d:  stind.i1  
  IL_000e:  ret       
}
]]>)
 
            verifier.VerifyIL("Module1.Test5",
            <![CDATA[
{
  // Code size       21 (0x15)
  .maxstack  1
  .locals init (Integer V_0)
  IL_0000:  ldsfld     "Module1.staticFld As Byte"
  IL_0005:  stloc.0   
  IL_0006:  ldloca.s   V_0
  IL_0008:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_000d:  ldloc.0   
  IL_000e:  conv.ovf.u1
  IL_000f:  stsfld     "Module1.staticFld As Byte"
  IL_0014:  ret       
}
]]>)
 
#If DONT_USE_BYREF_LOCALS_FOR_USE_TWICE Then
            verifier.VerifyIL("Module1.Test5_1",
<![CDATA[
{
  // Code size       25 (0x19)
  .maxstack  2
  .locals init (TestClass V_0,
           Integer V_1)
  IL_0000:  ldarg.0   
  IL_0001:  dup       
  IL_0002:  stloc.0   
  IL_0003:  ldfld      "TestClass.instanceFld As Byte"
  IL_0008:  stloc.1   
  IL_0009:  ldloca.s   V_1
  IL_000b:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_0010:  ldloc.0   
  IL_0011:  ldloc.1   
  IL_0012:  conv.ovf.u1
  IL_0013:  stfld      "TestClass.instanceFld As Byte"
  IL_0018:  ret       
}
]]>)
#Else
            verifier.VerifyIL("Module1.Test5_1",
            <![CDATA[
{
  // Code size       20 (0x14)
  .maxstack  2
  .locals init (Integer V_0)
  IL_0000:  ldarg.0
  IL_0001:  ldflda     "TestClass.instanceFld As Byte"
  IL_0006:  dup
  IL_0007:  ldind.u1
  IL_0008:  stloc.0
  IL_0009:  ldloca.s   V_0
  IL_000b:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_0010:  ldloc.0
  IL_0011:  conv.ovf.u1
  IL_0012:  stind.i1
  IL_0013:  ret
}
]]>)
#End If
 
            verifier.VerifyIL("Module1.Test5_2",
            <![CDATA[
{
  // Code size       14 (0xe)
  .maxstack  1
  .locals init (Integer V_0)
  IL_0000:  ldsfld     "Module1.staticReadonlyFld As Integer"
  IL_0005:  stloc.0   
  IL_0006:  ldloca.s   V_0
  IL_0008:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_000d:  ret       
}
]]>)
 
            verifier.VerifyIL("Module1.Test5_3",
            <![CDATA[
{
  // Code size       15 (0xf)
  .maxstack  1
  .locals init (Integer V_0)
  IL_0000:  ldarg.0   
  IL_0001:  ldfld      "TestClass.instanceReadonlyFld As Integer"
  IL_0006:  stloc.0   
  IL_0007:  ldloca.s   V_0
  IL_0009:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_000e:  ret       
}
]]>)
 
#If DONT_USE_BYREF_LOCALS_FOR_USE_TWICE Then
            verifier.VerifyIL("Module1.Test5_4",
<![CDATA[
{
  // Code size       23 (0x17)
  .maxstack  2
  .locals init (Integer V_0)
  IL_0000:  ldarg.0   
  IL_0001:  ldfld      "TestStruct.instanceFld As Byte"
  IL_0006:  stloc.0   
  IL_0007:  ldloca.s   V_0
  IL_0009:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_000e:  ldarg.0   
  IL_000f:  ldloc.0   
  IL_0010:  conv.ovf.u1
  IL_0011:  stfld      "TestStruct.instanceFld As Byte"
  IL_0016:  ret       
}
]]>)
#Else
            verifier.VerifyIL("Module1.Test5_4",
            <![CDATA[
{
  // Code size       20 (0x14)
  .maxstack  2
  .locals init (Integer V_0)
  IL_0000:  ldarg.0
  IL_0001:  ldflda     "TestStruct.instanceFld As Byte"
  IL_0006:  dup
  IL_0007:  ldind.u1
  IL_0008:  stloc.0
  IL_0009:  ldloca.s   V_0
  IL_000b:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_0010:  ldloc.0
  IL_0011:  conv.ovf.u1
  IL_0012:  stind.i1
  IL_0013:  ret
}
]]>)
#End If
 
#If DONT_USE_BYREF_LOCALS_FOR_USE_TWICE Then
            verifier.VerifyIL("Module1.Test5_5",
<![CDATA[
{
// Code size       34 (0x22)
.maxstack  2
.locals init (Byte V_0, //Test5_5
Integer V_1)
IL_0000:  ldarga.s   V_0
IL_0002:  ldfld      "TestStruct.instanceFld As Byte"
IL_0007:  stloc.1
IL_0008:  ldloca.s   V_1
IL_000a:  call       "Sub Module1.TestByRef(ByRef Integer)"
IL_000f:  ldarga.s   V_0
IL_0011:  ldloc.1
IL_0012:  conv.ovf.u1
IL_0013:  stfld      "TestStruct.instanceFld As Byte"
IL_0018:  ldarga.s   V_0
IL_001a:  ldfld      "TestStruct.instanceFld As Byte"
IL_001f:  stloc.0
IL_0020:  ldloc.0
IL_0021:  ret
}
]]>)
#Else
            verifier.VerifyIL("Module1.Test5_5",
            <![CDATA[
{
  // Code size       27 (0x1b)
  .maxstack  2
  .locals init (Integer V_0)
  IL_0000:  ldarga.s   V_0
  IL_0002:  ldflda     "TestStruct.instanceFld As Byte"
  IL_0007:  dup
  IL_0008:  ldind.u1
  IL_0009:  stloc.0
  IL_000a:  ldloca.s   V_0
  IL_000c:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_0011:  ldloc.0
  IL_0012:  conv.ovf.u1
  IL_0013:  stind.i1
  IL_0014:  ldarg.0
  IL_0015:  ldfld      "TestStruct.instanceFld As Byte"
  IL_001a:  ret
}
]]>)
#End If
 
            verifier.VerifyIL("Module1.Test5_6",
            <![CDATA[
{
  // Code size       15 (0xf)
  .maxstack  1
  .locals init (Integer V_0)
  IL_0000:  ldarg.0
  IL_0001:  ldfld      "TestStruct.instanceReadonlyFld As Integer"
  IL_0006:  stloc.0
  IL_0007:  ldloca.s   V_0
  IL_0009:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_000e:  ret
}
]]>)
 
            verifier.VerifyIL("Module1.Test5_7",
            <![CDATA[
{
  // Code size       14 (0xe)
  .maxstack  1
  .locals init (Integer V_0)
  IL_0000:  call       "Function Module1.ReturnInteger() As Integer"
  IL_0005:  stloc.0   
  IL_0006:  ldloca.s   V_0
  IL_0008:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_000d:  ret       
}
]]>)
 
            verifier.VerifyIL("Module1.Test5_8",
            <![CDATA[
{
  // Code size       19 (0x13)
  .maxstack  1
  .locals init (Integer V_0)
  IL_0000:  call       "Function Module1.ReturnTestStruct() As TestStruct"
  IL_0005:  ldfld      "TestStruct.instanceFld2 As Integer"
  IL_000a:  stloc.0   
  IL_000b:  ldloca.s   V_0
  IL_000d:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_0012:  ret       
}
]]>)
 
#If DONT_USE_BYREF_LOCALS_FOR_USE_TWICE Then
            verifier.VerifyIL("Module1.Test5_9",
<![CDATA[
{
  // Code size       30 (0x1e)
  .maxstack  2
  .locals init (TestClass V_0,
           Integer V_1)
  IL_0000:  ldarg.0   
  IL_0001:  call       "Function Module1.ReturnTestClass(TestClass) As TestClass"
  IL_0006:  dup       
  IL_0007:  stloc.0   
  IL_0008:  ldfld      "TestClass.instanceFld As Byte"
  IL_000d:  stloc.1   
  IL_000e:  ldloca.s   V_1
  IL_0010:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_0015:  ldloc.0   
  IL_0016:  ldloc.1   
  IL_0017:  conv.ovf.u1
  IL_0018:  stfld      "TestClass.instanceFld As Byte"
  IL_001d:  ret       
}
]]>)
#Else
            verifier.VerifyIL("Module1.Test5_9",
            <![CDATA[
{
  // Code size       25 (0x19)
  .maxstack  2
  .locals init (Integer V_0)
  IL_0000:  ldarg.0
  IL_0001:  call       "Function Module1.ReturnTestClass(TestClass) As TestClass"
  IL_0006:  ldflda     "TestClass.instanceFld As Byte"
  IL_000b:  dup
  IL_000c:  ldind.u1
  IL_000d:  stloc.0
  IL_000e:  ldloca.s   V_0
  IL_0010:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_0015:  ldloc.0
  IL_0016:  conv.ovf.u1
  IL_0017:  stind.i1
  IL_0018:  ret
}
]]>)
#End If
 
            verifier.VerifyIL("Module1.Test5_10",
            <![CDATA[
{
  // Code size       10 (0xa)
  .maxstack  1
  .locals init (Integer V_0)
  IL_0000:  ldc.i4.1  
  IL_0001:  stloc.0   
  IL_0002:  ldloca.s   V_0
  IL_0004:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_0009:  ret       
}
]]>)
 
#If DONT_USE_BYREF_LOCALS_FOR_USE_TWICE Then
            verifier.VerifyIL("TestStruct.Test1",
<![CDATA[
{
  // Code size       23 (0x17)
  .maxstack  2
  .locals init (Integer V_0)
  IL_0000:  ldarg.0   
  IL_0001:  ldfld      "TestStruct.instanceFld As Byte"
  IL_0006:  stloc.0   
  IL_0007:  ldloca.s   V_0
  IL_0009:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_000e:  ldarg.0   
  IL_000f:  ldloc.0   
  IL_0010:  conv.ovf.u1
  IL_0011:  stfld      "TestStruct.instanceFld As Byte"
  IL_0016:  ret       
}
]]>)
#Else
            verifier.VerifyIL("TestStruct.Test1",
            <![CDATA[
{
  // Code size       20 (0x14)
  .maxstack  2
  .locals init (Integer V_0)
  IL_0000:  ldarg.0
  IL_0001:  ldflda     "TestStruct.instanceFld As Byte"
  IL_0006:  dup
  IL_0007:  ldind.u1
  IL_0008:  stloc.0
  IL_0009:  ldloca.s   V_0
  IL_000b:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_0010:  ldloc.0
  IL_0011:  conv.ovf.u1
  IL_0012:  stind.i1
  IL_0013:  ret
}
]]>)
#End If
 
#If DONT_USE_BYREF_LOCALS_FOR_USE_TWICE Then
            verifier.VerifyIL("TestStruct.Test2",
<![CDATA[
{
  // Code size       23 (0x17)
  .maxstack  2
  .locals init (Integer V_0)
  IL_0000:  ldarg.0   
  IL_0001:  ldfld      "TestStruct.instanceFld As Byte"
  IL_0006:  stloc.0   
  IL_0007:  ldloca.s   V_0
  IL_0009:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_000e:  ldarg.0   
  IL_000f:  ldloc.0   
  IL_0010:  conv.ovf.u1
  IL_0011:  stfld      "TestStruct.instanceFld As Byte"
  IL_0016:  ret       
}
]]>)
#Else
            verifier.VerifyIL("TestStruct.Test2",
            <![CDATA[
{
  // Code size       20 (0x14)
  .maxstack  2
  .locals init (Integer V_0)
  IL_0000:  ldarg.0
  IL_0001:  ldflda     "TestStruct.instanceFld As Byte"
  IL_0006:  dup
  IL_0007:  ldind.u1
  IL_0008:  stloc.0
  IL_0009:  ldloca.s   V_0
  IL_000b:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_0010:  ldloc.0
  IL_0011:  conv.ovf.u1
  IL_0012:  stind.i1
  IL_0013:  ret
}
]]>)
#End If
 
            verifier.VerifyIL("TestStruct.Test3",
            <![CDATA[
{
  // Code size       15 (0xf)
  .maxstack  1
  .locals init (Integer V_0)
  IL_0000:  ldarg.0   
  IL_0001:  ldfld      "TestStruct.instanceReadonlyFld As Integer"
  IL_0006:  stloc.0   
  IL_0007:  ldloca.s   V_0
  IL_0009:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_000e:  ret       
}
]]>)
 
#If DONT_USE_BYREF_LOCALS_FOR_USE_TWICE Then
            verifier.VerifyIL("Module1.Test6",
<![CDATA[
{
  // Code size       19 (0x13)
  .maxstack  3
  .locals init (Byte() V_0,
  Integer V_1)
  IL_0000:  ldarg.0
  IL_0001:  dup       
  IL_0002:  stloc.0   
  IL_0003:  ldc.i4.1  
  IL_0004:  ldelem.u1 
  IL_0005:  stloc.1   
  IL_0006:  ldloca.s   V_1
  IL_0008:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_000d:  ldloc.0   
  IL_000e:  ldc.i4.1  
  IL_000f:  ldloc.1   
  IL_0010:  conv.ovf.u1
  IL_0011:  stelem.i1 
  IL_0012:  ret       
}
]]>)
#Else
            verifier.VerifyIL("Module1.Test6",
            <![CDATA[
{
  // Code size       21 (0x15)
  .maxstack  2
  .locals init (Integer V_0)
  IL_0000:  ldarg.0
  IL_0001:  ldc.i4.1
  IL_0002:  ldelema    "Byte"
  IL_0007:  dup
  IL_0008:  ldind.u1
  IL_0009:  stloc.0
  IL_000a:  ldloca.s   V_0
  IL_000c:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_0011:  ldloc.0
  IL_0012:  conv.ovf.u1
  IL_0013:  stind.i1
  IL_0014:  ret
}
]]>)
#End If
 
#If DONT_USE_BYREF_LOCALS_FOR_USE_TWICE Then
            verifier.VerifyIL("Module1.Test6_1",
<![CDATA[
{
  // Code size       24 (0x18)
  .maxstack  3
  .locals init (Byte() V_0,
           Integer V_1)
  IL_0000:  ldarg.0   
  IL_0001:  call       "Function Module1.ReturnArray(Byte()) As Byte()"
  IL_0006:  dup       
  IL_0007:  stloc.0   
  IL_0008:  ldc.i4.1  
  IL_0009:  ldelem.u1 
  IL_000a:  stloc.1   
  IL_000b:  ldloca.s   V_1
  IL_000d:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_0012:  ldloc.0   
  IL_0013:  ldc.i4.1  
  IL_0014:  ldloc.1   
  IL_0015:  conv.ovf.u1
  IL_0016:  stelem.i1 
  IL_0017:  ret       
}
]]>)
#Else
            verifier.VerifyIL("Module1.Test6_1",
            <![CDATA[
{
  // Code size       26 (0x1a)
  .maxstack  2
  .locals init (Integer V_0)
  IL_0000:  ldarg.0
  IL_0001:  call       "Function Module1.ReturnArray(Byte()) As Byte()"
  IL_0006:  ldc.i4.1
  IL_0007:  ldelema    "Byte"
  IL_000c:  dup
  IL_000d:  ldind.u1
  IL_000e:  stloc.0
  IL_000f:  ldloca.s   V_0
  IL_0011:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_0016:  ldloc.0
  IL_0017:  conv.ovf.u1
  IL_0018:  stind.i1
  IL_0019:  ret
}
]]>)
#End If
 
#If DONT_USE_BYREF_LOCALS_FOR_USE_TWICE Then
            verifier.VerifyIL("Module1.Test6_2",
<![CDATA[
{
  // Code size       43 (0x2b)
  .maxstack  3
  .locals init (TestStruct() V_0,
           Integer V_1,
           Integer V_2)
  IL_0000:  ldarg.0   
  IL_0001:  dup       
  IL_0002:  stloc.0   
  IL_0003:  call       "Function Module1.Return1() As Integer"
  IL_0008:  dup       
  IL_0009:  stloc.1   
  IL_000a:  ldelema    "TestStruct"
  IL_000f:  ldfld      "TestStruct.instanceFld As Byte"
  IL_0014:  stloc.2   
  IL_0015:  ldloca.s   V_2
  IL_0017:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_001c:  ldloc.0   
  IL_001d:  ldloc.1   
  IL_001e:  ldelema    "TestStruct"
  IL_0023:  ldloc.2   
  IL_0024:  conv.ovf.u1
  IL_0025:  stfld      "TestStruct.instanceFld As Byte"
  IL_002a:  ret       
}
]]>)
#Else
            verifier.VerifyIL("Module1.Test6_2",
            <![CDATA[
{
  // Code size       30 (0x1e)
  .maxstack  2
  .locals init (Integer V_0)
  IL_0000:  ldarg.0
  IL_0001:  call       "Function Module1.Return1() As Integer"
  IL_0006:  ldelema    "TestStruct"
  IL_000b:  ldflda     "TestStruct.instanceFld As Byte"
  IL_0010:  dup
  IL_0011:  ldind.u1
  IL_0012:  stloc.0
  IL_0013:  ldloca.s   V_0
  IL_0015:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_001a:  ldloc.0
  IL_001b:  conv.ovf.u1
  IL_001c:  stind.i1
  IL_001d:  ret
}
]]>)
#End If
 
#If DONT_USE_BYREF_LOCALS_FOR_USE_TWICE Then
            verifier.VerifyIL("Module1.Test6_3",
<![CDATA[
{
  // Code size       37 (0x25)
  .maxstack  2
  .locals init (TestStruct() V_0,
           Integer V_1)
  IL_0000:  ldarg.0   
  IL_0001:  dup       
  IL_0002:  stloc.0   
  IL_0003:  ldc.i4.1  
  IL_0004:  ldelema    "TestStruct"
  IL_0009:  ldfld      "TestStruct.instanceFld As Byte"
  IL_000e:  stloc.1   
  IL_000f:  ldloca.s   V_1
  IL_0011:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_0016:  ldloc.0   
  IL_0017:  ldc.i4.1  
  IL_0018:  ldelema    "TestStruct"
  IL_001d:  ldloc.1   
  IL_001e:  conv.ovf.u1
  IL_001f:  stfld      "TestStruct.instanceFld As Byte"
  IL_0024:  ret       
}
]]>)
#Else
            verifier.VerifyIL("Module1.Test6_3",
            <![CDATA[
{
  // Code size       26 (0x1a)
  .maxstack  2
  .locals init (Integer V_0)
  IL_0000:  ldarg.0
  IL_0001:  ldc.i4.1
  IL_0002:  ldelema    "TestStruct"
  IL_0007:  ldflda     "TestStruct.instanceFld As Byte"
  IL_000c:  dup
  IL_000d:  ldind.u1
  IL_000e:  stloc.0
  IL_000f:  ldloca.s   V_0
  IL_0011:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_0016:  ldloc.0
  IL_0017:  conv.ovf.u1
  IL_0018:  stind.i1
  IL_0019:  ret
}
]]>)
#End If
        End Sub
 
        ' Same as ByRefArguments2 but with properties not fields.
        <Fact>
        Public Sub ByRefArguments2A()
            Dim compilationDef =
<compilation name="VBByRefArguments2A">
    <file name="a.vb">
Option Strict Off
 
Imports System
 
Module Module1
 
    Property staticFld As Byte
    ReadOnly _staticReadonlyFld As Integer
    ReadOnly Property staticReadonlyFld As Integer
        Get
            Return _staticReadonlyFld
        End Get
    End Property
 
    Sub Main()
 
        Dim z As Byte() = New Byte() {0, 81}
 
        System.Console.WriteLine("---")
        Test1()
 
        System.Console.WriteLine("---")
        System.Console.WriteLine(Test2())
        System.Console.WriteLine("---")
        Test2_1()
 
        System.Console.WriteLine("---")
        System.Console.WriteLine(Test3())
        System.Console.WriteLine("---")
        System.Console.WriteLine(Test3_1())
        System.Console.WriteLine("---")
        System.Console.WriteLine(Test3_2())
 
        System.Console.WriteLine("---")
        System.Console.WriteLine(Test4(51))
 
        System.Console.WriteLine("---")
        staticFld = 61
        Test5()
        System.Console.WriteLine(staticFld)
 
        Dim tc As TestClass = New TestClass()
        System.Console.WriteLine("---")
        tc.instanceFld = 63
        Test5_1(tc)
        System.Console.WriteLine(tc.instanceFld)
 
        System.Console.WriteLine("---")
        Test5_2()
        System.Console.WriteLine("---")
        Test5_3(tc)
 
        Dim ts As TestStruct = New TestStruct()
        ts.instanceFld = 65
        System.Console.WriteLine("---")
        Test5_4(ts)
        System.Console.WriteLine(ts.instanceFld)
        System.Console.WriteLine("---")
        System.Console.WriteLine(Test5_5(ts))
        System.Console.WriteLine("---")
        Test5_6(ts)
        System.Console.WriteLine("---")
        Test5_7()
        System.Console.WriteLine("---")
        Test5_8()
        System.Console.WriteLine("---")
        Test5_9(tc)
        System.Console.WriteLine(tc.instanceFld)
        System.Console.WriteLine("---")
        Test5_10()
 
 
        System.Console.WriteLine("---")
        Test6(z)
        System.Console.WriteLine(z(1))
        System.Console.WriteLine("---")
        Test6_1(z)
        System.Console.WriteLine(z(1))
 
        ts.instanceFld = 91
        Dim z1 As TestStruct() = New TestStruct() {Nothing, ts}
 
        System.Console.WriteLine("---")
        Test6_2(z1)
        System.Console.WriteLine(z1(1).instanceFld)
        System.Console.WriteLine("---")
        Test6_3(z1)
        System.Console.WriteLine(z1(1).instanceFld)
 
    End Sub
 
 
    Sub Test6(z As Byte())
        TestByRef(z(1))
    End Sub
 
    Sub Test6_1(z As Byte())
        TestByRef(ReturnArray(z)(1))
    End Sub
 
    Sub Test6_2(z As TestStruct())
        TestByRef(z(Return1()).instanceFld)
    End Sub
 
    Sub Test6_3(z As TestStruct())
        TestByRef(z(1).instanceFld)
    End Sub
 
    Sub Test1()
        TestByRef(20)
    End Sub
 
    Function Test2() As Long
        Dim x As Byte = 30
        Return TestByRef2(CInt(x))
    End Function
 
    Sub Test2_1()
        Dim x As Byte = 32
        TestByRef2(CInt(x))
    End Sub
 
    Function Test3() As Byte
        Dim x As Byte = 40
        TestByRef(x)
        Return x
    End Function
 
    Function Test3_1() As Long
        Dim x As Byte = 42
        Return TestByRef2(x) + x
    End Function
 
    Function Test3_2() As Byte
        Dim x As Byte = 44
        TestByRef2(x)
        Return x
    End Function
 
    Function Test4(x As Byte) As Byte
        TestByRef(x)
        Return x
    End Function
 
    Sub Test5()
        TestByRef(staticFld)
    End Sub
 
    Sub Test5_1(x As TestClass)
        TestByRef(x.instanceFld)
    End Sub
 
    Sub Test5_2()
        TestByRef(staticReadonlyFld)
    End Sub
 
    Sub Test5_3(x As TestClass)
        TestByRef(x.instanceReadonlyFld)
    End Sub
 
    Sub Test5_4(ByRef x As TestStruct)
        TestByRef(x.instanceFld)
    End Sub
 
    Function Test5_5(x As TestStruct) As Byte
        TestByRef(x.instanceFld)
        Return x.instanceFld
    End Function
 
    Sub Test5_6(x As TestStruct)
        TestByRef(x.instanceReadonlyFld)
    End Sub
 
    Sub Test5_7()
        TestByRef(ReturnInteger())
    End Sub
 
    Sub Test5_8()
        TestByRef(ReturnTestStruct().instanceFld2)
    End Sub
 
    Sub Test5_9(x As TestClass)
        TestByRef(ReturnTestClass(x).instanceFld)
    End Sub
 
    Sub Test5_10()
        TestByRef(1)
    End Sub
 
    Function ReturnInteger() As Integer
        Return 71
    End Function
 
    Function ReturnTestStruct() As TestStruct
        Dim x As TestStruct = New TestStruct()
        x.instanceFld2 = 73
        Return x
    End Function
 
    Function ReturnTestClass(x As TestClass) As TestClass
        Return x
    End Function
 
    Sub TestByRef(ByRef a As Integer)
        System.Console.WriteLine("TestByRef: {0}", a)
        a = a + 1
    End Sub
 
    Function TestByRef2(ByRef a As Integer) As Long
        System.Console.WriteLine("TestByRef2: {0}", a)
        a = a + 1
        Return a
    End Function
 
    Function ReturnArray(z As Byte()) As Byte()
        System.Console.WriteLine("ReturnArray")
        Return z
    End Function
 
    Function Return1() As Integer
        System.Console.WriteLine("Return1")
        Return 1
    End Function
 
End Module
 
Class TestClass
    Public Property instanceFld As Byte
    Private ReadOnly _instanceReadonlyFld As Integer
    Public ReadOnly Property instanceReadonlyFld As Integer
        Get
            Return _instanceReadonlyFld
        End Get
    End Property
End Class
 
Structure TestStruct
    Public Property instanceFld As Byte
    Private ReadOnly _instanceReadonlyFld As Integer
    Public ReadOnly Property instanceReadonlyFld As Integer
        Get
            Return _instanceReadonlyFld
        End Get
    End Property
    Public Property instanceFld2 As Integer
 
    Sub Test1()
        TestByRef(Me.instanceFld)
    End Sub
 
    Sub Test2()
        TestByRef(instanceFld)
    End Sub
 
    Sub Test3()
        TestByRef(Me.instanceReadonlyFld)
    End Sub
End Structure
    </file>
</compilation>
 
            CompileAndVerify(compilationDef,
                             expectedOutput:=
            <![CDATA[
---
TestByRef: 20
---
TestByRef2: 30
31
---
TestByRef2: 32
---
TestByRef: 40
41
---
TestByRef2: 42
86
---
TestByRef2: 44
45
---
TestByRef: 51
52
---
TestByRef: 61
62
---
TestByRef: 63
64
---
TestByRef: 0
---
TestByRef: 0
---
TestByRef: 65
66
---
TestByRef: 66
67
---
TestByRef: 0
---
TestByRef: 71
---
TestByRef: 73
---
TestByRef: 64
65
---
TestByRef: 1
---
TestByRef: 81
82
---
ReturnArray
TestByRef: 82
83
---
Return1
TestByRef: 91
92
---
TestByRef: 92
93
]]>)
        End Sub
 
        <Fact>
        Public Sub ByRefArguments3()
            Dim compilationDef =
<compilation name="VBByRefArguments3">
    <file name="a.vb">
Option Strict Off
 
Imports System
 
Module Module1
 
    Sub Main()
 
        Dim By As Byte = 53
        Dim Ob As Object
 
        Ob = New TestClass(By)
        System.Console.WriteLine(By)
        Ob = New TestStructure(By)
        System.Console.WriteLine(By)
    End Sub
 
End Module
 
Class TestClass
    Public Sub New(ByRef x As Integer)
        x = x + 1
    End Sub
End Class
 
Structure TestStructure
    Public Sub New(ByRef x As Integer)
        x = x + 1
    End Sub
End Structure
    </file>
</compilation>
 
            CompileAndVerify(compilationDef,
                             expectedOutput:=
            <![CDATA[
54
55
]]>)
 
        End Sub
 
        <Fact>
        Public Sub ByRefArguments4()
            Dim compilationDef =
<compilation name="VBByRefArguments4">
    <file name="a.vb">
Option Strict Off
 
Imports System
 
Module Module1
 
    Sub Main()
 
        System.Console.WriteLine("---")
        Test1()
 
        System.Console.WriteLine("---")
        System.Console.WriteLine(TestClass.baseStaticReadonlyFld)
        System.Console.WriteLine(TestClass.staticReadonlyFld)
        System.Console.WriteLine(TestClass.output)
 
        System.Console.WriteLine("---")
        Dim tc1 As TestClass = New TestClass()
        System.Console.WriteLine(tc1.instanceReadonlyFld)
 
        System.Console.WriteLine("---")
        Dim tc2 As TestClass = New TestClass(tc1)
        System.Console.WriteLine(tc1.instanceReadonlyFld)
        System.Console.WriteLine(tc2.instanceReadonlyFld)
 
        System.Console.WriteLine("---")
        Dim tc3 As TestClass = New TestClass(tc1, tc2)
        System.Console.WriteLine(TestClass.staticReadonlyFld)
 
        System.Console.WriteLine("---")
        Dim tc4 As TestClass = New TestClass(tc1, tc2, tc3)
        System.Console.WriteLine(tc4.baseInstanceReadonlyFld)
 
        System.Console.WriteLine("---")
        Test2(tc1)
        System.Console.WriteLine(TestClass.staticField)
 
        System.Console.WriteLine("---")
        Dim z As Byte() = New Byte() {0, 3}
        'Dim z As Byte() = New Byte() {0, 1, 2, 3, 4}
        Test3(z)
        System.Console.WriteLine(z((1 + 1 * 2)/3))
    End Sub
 
 
    Sub Test1()
        TestByRef(System.Int32.MinValue)
    End Sub
 
    Sub Test2(tc As TestClass)
        TestByRef(tc.staticField)
    End Sub
 
    Sub Test3(z As Byte())
        TestByRef(z((1 + 1 * 2)/3))
    End Sub
 
    Sub TestByRef(ByRef a As Integer)
        System.Console.WriteLine("TestByRef: {0}", a)
        a = a + 1
    End Sub
 
 
End Module
 
Class Base
    Public ReadOnly baseInstanceReadonlyFld As Integer
    Public Shared ReadOnly baseStaticReadonlyFld As Integer
End Class
 
Class TestClass
    Inherits Base
 
    Public ReadOnly instanceReadonlyFld As Integer
    Public Shared ReadOnly staticReadonlyFld As Integer
    Public Shared output As Integer
    Public Shared staticField As Byte
 
    Sub New()
        TestByRef(instanceReadonlyFld)
    End Sub
 
    Sub New(tc As TestClass)
        TestByRef(tc.instanceReadonlyFld)
    End Sub
 
    Sub New(tc1 As TestClass, tc2 As TestClass)
        TestByRef(Me.staticReadonlyFld)
    End Sub
 
    Sub New(tc1 As TestClass, tc2 As TestClass, tc3 As TestClass)
        TestByRef(Me.baseInstanceReadonlyFld)
    End Sub
 
    Shared Sub New()
        TestByRef(staticReadonlyFld)
        TestByRef(baseStaticReadonlyFld)
 
        Dim tc As TestClass = New TestClass()
        TestByRef(tc.instanceReadonlyFld)
        output = tc.instanceReadonlyFld
    End Sub
 
End Class
    </file>
</compilation>
 
            Dim verifier = CompileAndVerify(compilationDef,
                             expectedOutput:=
            <![CDATA[
---
TestByRef: -2147483648
---
0
TestByRef: 0
TestByRef: 0
TestByRef: 0
TestByRef: 1
1
1
---
TestByRef: 0
1
---
TestByRef: 1
1
0
---
TestByRef: 1
1
---
TestByRef: 0
0
---
TestByRef: 0
1
---
TestByRef: 3
4
]]>)
 
            verifier.VerifyIL("Module1.Test1",
            <![CDATA[
{
  // Code size       14 (0xe)
  .maxstack  1
  .locals init (Integer V_0)
  IL_0000:  ldc.i4     0x80000000
  IL_0005:  stloc.0   
  IL_0006:  ldloca.s   V_0
  IL_0008:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_000d:  ret       
}
]]>)
 
            verifier.VerifyIL("TestClass..ctor",
            <![CDATA[
{
  // Code size       18 (0x12)
  .maxstack  1
  IL_0000:  ldarg.0   
  IL_0001:  call       "Sub Base..ctor()"
  IL_0006:  ldarg.0   
  IL_0007:  ldflda     "TestClass.instanceReadonlyFld As Integer"
  IL_000c:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_0011:  ret       
}
]]>)
 
            verifier.VerifyIL("TestClass..ctor(TestClass)",
            <![CDATA[
{
  // Code size       21 (0x15)
  .maxstack  1
  .locals init (Integer V_0)
  IL_0000:  ldarg.0   
  IL_0001:  call       "Sub Base..ctor()"
  IL_0006:  ldarg.1   
  IL_0007:  ldfld      "TestClass.instanceReadonlyFld As Integer"
  IL_000c:  stloc.0   
  IL_000d:  ldloca.s   V_0
  IL_000f:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_0014:  ret       
}
]]>)
 
            verifier.VerifyIL("TestClass..ctor(TestClass, TestClass)",
            <![CDATA[
{
  // Code size       20 (0x14)
  .maxstack  1
  .locals init (Integer V_0)
  IL_0000:  ldarg.0   
  IL_0001:  call       "Sub Base..ctor()"
  IL_0006:  ldsfld     "TestClass.staticReadonlyFld As Integer"
  IL_000b:  stloc.0   
  IL_000c:  ldloca.s   V_0
  IL_000e:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_0013:  ret       
}
]]>)
 
            verifier.VerifyIL("TestClass..ctor(TestClass, TestClass, TestClass)",
            <![CDATA[
{
  // Code size       21 (0x15)
  .maxstack  1
  .locals init (Integer V_0)
  IL_0000:  ldarg.0   
  IL_0001:  call       "Sub Base..ctor()"
  IL_0006:  ldarg.0   
  IL_0007:  ldfld      "Base.baseInstanceReadonlyFld As Integer"
  IL_000c:  stloc.0   
  IL_000d:  ldloca.s   V_0
  IL_000f:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_0014:  ret       
}
]]>)
 
            verifier.VerifyIL("TestClass..cctor",
            <![CDATA[
{
  // Code size       53 (0x35)
  .maxstack  2
  .locals init (Integer V_0)
  IL_0000:  ldsflda    "TestClass.staticReadonlyFld As Integer"
  IL_0005:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_000a:  ldsfld     "Base.baseStaticReadonlyFld As Integer"
  IL_000f:  stloc.0
  IL_0010:  ldloca.s   V_0
  IL_0012:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_0017:  newobj     "Sub TestClass..ctor()"
  IL_001c:  dup
  IL_001d:  ldfld      "TestClass.instanceReadonlyFld As Integer"
  IL_0022:  stloc.0
  IL_0023:  ldloca.s   V_0
  IL_0025:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_002a:  ldfld      "TestClass.instanceReadonlyFld As Integer"
  IL_002f:  stsfld     "TestClass.output As Integer"
  IL_0034:  ret
}
]]>)
 
            verifier.VerifyIL("Module1.Test2",
            <![CDATA[
{
  // Code size       21 (0x15)
  .maxstack  1
  .locals init (Integer V_0)
  IL_0000:  ldsfld     "TestClass.staticField As Byte"
  IL_0005:  stloc.0   
  IL_0006:  ldloca.s   V_0
  IL_0008:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_000d:  ldloc.0   
  IL_000e:  conv.ovf.u1
  IL_000f:  stsfld     "TestClass.staticField As Byte"
  IL_0014:  ret       
}
]]>)
 
#If DONT_USE_BYREF_LOCALS_FOR_USE_TWICE Then
            verifier.VerifyIL("Module1.Test3",
<![CDATA[
{
  // Code size       19 (0x13)
  .maxstack  3
  .locals init (Byte() V_0,
           Integer V_1)
  IL_0000:  ldarg.0   
  IL_0001:  dup       
  IL_0002:  stloc.0   
  IL_0003:  ldc.i4.1  
  IL_0004:  ldelem.u1 
  IL_0005:  stloc.1   
  IL_0006:  ldloca.s   V_1
  IL_0008:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_000d:  ldloc.0   
  IL_000e:  ldc.i4.1  
  IL_000f:  ldloc.1   
  IL_0010:  conv.ovf.u1
  IL_0011:  stelem.i1 
  IL_0012:  ret       
}
]]>)
#Else
            verifier.VerifyIL("Module1.Test3",
            <![CDATA[
{
  // Code size       21 (0x15)
  .maxstack  2
  .locals init (Integer V_0)
  IL_0000:  ldarg.0
  IL_0001:  ldc.i4.1
  IL_0002:  ldelema    "Byte"
  IL_0007:  dup
  IL_0008:  ldind.u1
  IL_0009:  stloc.0
  IL_000a:  ldloca.s   V_0
  IL_000c:  call       "Sub Module1.TestByRef(ByRef Integer)"
  IL_0011:  ldloc.0
  IL_0012:  conv.ovf.u1
  IL_0013:  stind.i1
  IL_0014:  ret
}
]]>)
#End If
        End Sub
 
        <Fact>
        Public Sub ByRefArguments5()
            Dim compilationDef =
<compilation name="VBByRefArguments5">
    <file name="a.vb">
Option Strict Off
 
Imports System
 
Module Module1
 
    Sub Main()
 
        Dim s2 As TestStruct2 = New TestStruct2()
        s2.fld2.fld1 = 1
 
        System.Console.WriteLine((s2.fld2).Increment())
        System.Console.WriteLine(s2.fld2.fld1)
        System.Console.WriteLine((s2.fld2).Increment())
        System.Console.WriteLine(s2.fld2.fld1)
        System.Console.WriteLine((s2.fld2).Increment())
        System.Console.WriteLine(s2.fld2.fld1)
 
        System.Console.WriteLine("----")
 
        System.Console.WriteLine(s2.fld2.fld1)
        Test1(s2)
        System.Console.WriteLine(s2.fld2.fld1)
        Test2(s2)
        System.Console.WriteLine(s2.fld2.fld1)
        Test3(s2)
        System.Console.WriteLine(s2.fld2.fld1)
        Test4(s2)
        System.Console.WriteLine(s2.fld2.fld1)
    End Sub
 
 
 
    Sub Test1(ByRef s2 As TestStruct2)
        Increment(s2.fld2.fld1)
    End Sub
 
    Sub Test2(ByRef s2 As TestStruct2)
        Increment((s2).fld2.fld1)
    End Sub
 
    Sub Test3(ByRef s2 As TestStruct2)
        Increment((s2.fld2).fld1)
    End Sub
 
    Sub Test4(ByRef s2 As TestStruct2)
        Increment((s2.fld2.fld1))
    End Sub
 
    Sub Increment(ByRef x As Integer)
        x = x + 1
    End Sub
 
End Module
 
 
Structure TestStruct1
    Public fld1 As Integer
 
    Function Increment() As Integer
        fld1 = fld1 + 1
        Return fld1
    End Function
End Structure
 
Structure TestStruct2
    Public fld2 As TestStruct1
 
End Structure
    </file>
</compilation>
 
            Dim verifier = CompileAndVerify(compilationDef,
                             expectedOutput:=
            <![CDATA[
2
2
3
3
4
4
----
4
5
5
5
5
]]>)
            verifier.VerifyIL("Module1.Test1",
            <![CDATA[
{
  // Code size       17 (0x11)
  .maxstack  1
  IL_0000:  ldarg.0   
  IL_0001:  ldflda     "TestStruct2.fld2 As TestStruct1"
  IL_0006:  ldflda     "TestStruct1.fld1 As Integer"
  IL_000b:  call       "Sub Module1.Increment(ByRef Integer)"
  IL_0010:  ret       
}
]]>)
            verifier.VerifyIL("Module1.Test2",
            <![CDATA[
{
  // Code size       20 (0x14)
  .maxstack  1
  .locals init (Integer V_0)
  IL_0000:  ldarg.0   
  IL_0001:  ldflda     "TestStruct2.fld2 As TestStruct1"
  IL_0006:  ldfld      "TestStruct1.fld1 As Integer"
  IL_000b:  stloc.0   
  IL_000c:  ldloca.s   V_0
  IL_000e:  call       "Sub Module1.Increment(ByRef Integer)"
  IL_0013:  ret       
}
]]>)
            verifier.VerifyIL("Module1.Test3",
            <![CDATA[
{
  // Code size       20 (0x14)
  .maxstack  1
  .locals init (Integer V_0)
  IL_0000:  ldarg.0   
  IL_0001:  ldflda     "TestStruct2.fld2 As TestStruct1"
  IL_0006:  ldfld      "TestStruct1.fld1 As Integer"
  IL_000b:  stloc.0   
  IL_000c:  ldloca.s   V_0
  IL_000e:  call       "Sub Module1.Increment(ByRef Integer)"
  IL_0013:  ret       
}
]]>)
            verifier.VerifyIL("Module1.Test4",
            <![CDATA[
{
  // Code size       20 (0x14)
  .maxstack  1
  .locals init (Integer V_0)
  IL_0000:  ldarg.0   
  IL_0001:  ldflda     "TestStruct2.fld2 As TestStruct1"
  IL_0006:  ldfld      "TestStruct1.fld1 As Integer"
  IL_000b:  stloc.0   
  IL_000c:  ldloca.s   V_0
  IL_000e:  call       "Sub Module1.Increment(ByRef Integer)"
  IL_0013:  ret       
}
]]>)
        End Sub
 
        <Fact()>
        Public Sub ByRefArguments6()
 
            Dim compilationDef =
<compilation name="LambdaTests1">
    <file name="a.vb"><![CDATA[ 
Module Program

    Sub Test1(ByRef x As Object)
        x = -2
    End Sub

    Function Test2(Of T)(a As T(), i As Integer) As System.Action
        Return Sub()
                   Test1(a(i))
               End Sub
    End Function

    Sub Main()
        Dim a = New Integer() {1, 2, 3}
        Dim x As System.Action = Test2(a, 1)
        x()
        System.Console.WriteLine(a(1))
    End Sub
End Module
    ]]></file>
</compilation>
 
            Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe)
 
            Dim verifier = CompileAndVerify(compilation, expectedOutput:=
            <![CDATA[
-2
]]>)
        End Sub
 
        <Fact>
        Public Sub PassByRef()
            Dim source =
<compilation>
    <file name="c.vb">
Imports System
Class A
    Public Sub New(i As Short)
        FI = i
        _PI = i
        FB = New B(3)
        _PB = New B(3)
        FC = New C(4)
        _PC = New C(4)
        FT = New T(5)
        _PT = New T(5)
    End Sub
    Public FI As Short
    Private _PI As Short
    Property PI As Short
        Get
            Console.WriteLine("A.get_PI")
            Return _PI
        End Get
        Set(value As Short)
            Console.WriteLine("A.set_PI")
            _PI = value
        End Set
    End Property
    Public FC As C
    Private _PC As C
    Property PC As C
        Get
            Console.WriteLine("A.get_PC")
            Return _PC
        End Get
        Set(value As C)
            Console.WriteLine("A.set_PC")
            _PC = value
        End Set
    End Property
    Public FT As T
    Private _PT As T
    Property PT As T
        Get
            Console.WriteLine("A.get_PT")
            Return _PT
        End Get
        Set(value As T)
            Console.WriteLine("A.set_PT")
            _PT = value
        End Set
    End Property
    Public FB As B
    Private _PB As B
    Property PB As B
        Get
            Console.WriteLine("A.get_PB")
            Return _PB
        End Get
        Set(value As B)
            Console.WriteLine("A.set_PB")
            _PB = value
        End Set
    End Property
End Class
Class B
    Public Sub New(i As Short)
        FI = i
        _PI = i
        FC = New C(5)
        _PC = New C(5)
    End Sub
    Public FI As Short
    Private _PI As Short
    Property PI As Short
        Get
            Console.WriteLine("B.get_PI")
            Return _PI
        End Get
        Set(value As Short)
            Console.WriteLine("B.set_PI")
            _PI = value
        End Set
    End Property
    Public FC As C
    Private _PC As C
    Property PC As C
        Get
            Console.WriteLine("B.get_PC")
            Return _PC
        End Get
        Set(value As C)
            Console.WriteLine("B.set_PC")
            _PC = value
        End Set
    End Property
End Class
Structure S
    Public Sub New(i As Short)
        FI = i
        _PI = i
        FA = New A(2)
        _PA = New A(2)
        FC = New C(3)
        _PC = New C(3)
        FT = New T(4)
        _PT = New T(4)
    End Sub
    Public FI As Short
    Private _PI As Short
    Property PI As Short
        Get
            Console.WriteLine("S.get_PI")
            Return _PI
        End Get
        Set(value As Short)
            Console.WriteLine("S.set_PI")
            _PI = value
        End Set
    End Property
    Public FC As C
    Private _PC As C
    Property PC As C
        Get
            Console.WriteLine("S.get_PC")
            Return _PC
        End Get
        Set(value As C)
            Console.WriteLine("S.set_PC")
            _PC = value
        End Set
    End Property
    Public FT As T
    Private _PT As T
    Property PT As T
        Get
            Console.WriteLine("S.get_PT")
            Return _PT
        End Get
        Set(value As T)
            Console.WriteLine("S.set_PT")
            _PT = value
        End Set
    End Property
    Public FA As A
    Private _PA As A
    Property PA As A
        Get
            Console.WriteLine("S.get_PA")
            Return _PA
        End Get
        Set(value As A)
            Console.WriteLine("S.set_PA")
            _PA = value
        End Set
    End Property
End Structure
Structure T
    Public Sub New(i As Short)
        FI = i
        _PI = i
        FC = New C(6)
        _PC = New C(6)
    End Sub
    Public FI As Short
    Private _PI As Short
    Property PI As Short
        Get
            Console.WriteLine("T.get_PI")
            Return _PI
        End Get
        Set(value As Short)
            Console.WriteLine("T.set_PI")
            _PI = value
        End Set
    End Property
    Public FC As C
    Private _PC As C
    Property PC As C
        Get
            Console.WriteLine("T.get_PC")
            Return _PC
        End Get
        Set(value As C)
            Console.WriteLine("T.set_PC")
            _PC = value
        End Set
    End Property
End Structure
Class C
    Public N As Short
    Public Sub New(i As Short)
        N = i
    End Sub
    Public Overrides Function ToString() As String
        Return N.ToString()
    End Function
End Class
Class Prog
    Shared Sub Report(i As Integer)
        Console.WriteLine("=> {0}", i)
    End Sub
    Shared Sub Report(i As C)
        Console.WriteLine("=> {0}", i)
    End Sub
    Shared Sub M(ByRef i As Integer)
        Console.WriteLine("M")
        i = i + 1
    End Sub
    Shared Sub M(ByRef i As C)
        Console.WriteLine("M")
        i = New C(i.N + 1)
    End Sub
    Shared Sub Main()
        Dim x As A = New A(7)
        ' Value type members on class.
        M(x.FI)
        Report(x.FI)
        M(x.PI)
        Report(x.PI)
        ' Reference type members on class.
        M(x.FC)
        Report(x.FC)
        M(x.PC)
        Report(x.PC)
        ' Value type members on nested class.
        M(x.FB.FI)
        Report(x.FB.FI)
        M(x.FB.PI)
        Report(x.FB.PI)
        M(x.PB.FI)
        Report(x.PB.FI)
        M(x.PB.PI)
        Report(x.PB.PI)
        ' Reference type members on nested class.
        M(x.FB.FC)
        Report(x.FB.FC)
        M(x.FB.PC)
        Report(x.FB.PC)
        M(x.PB.FC)
        Report(x.PB.FC)
        M(x.PB.PC)
        Report(x.PB.PC)
        ' Value type members on nested struct.
        M(x.FT.FI)
        Report(x.FT.FI)
        M(x.FT.PI)
        Report(x.FT.PI)
        M(x.PT.FI)
        Report(x.PT.FI)
        M(x.PT.PI)
        Report(x.PT.PI)
        ' Reference type members on nested struct.
        M(x.FT.FC)
        Report(x.FT.FC)
        M(x.FT.PC)
        Report(x.FT.PC)
        M(x.PT.FC)
        Report(x.PT.FC)
        M(x.PT.PC)
        Report(x.PT.PC)
        Dim y As S = New S(9)
        ' Value type members on class.
        M(y.FI)
        Report(y.FI)
        M(y.PI)
        Report(y.PI)
        ' Reference type members on class.
        M(y.FC)
        Report(y.FC)
        M(y.PC)
        Report(y.PC)
        ' Value type members on nested class.
        M(y.FA.FI)
        Report(y.FA.FI)
        M(y.FA.PI)
        Report(y.FA.PI)
        M(y.PA.FI)
        Report(y.PA.FI)
        M(y.PA.PI)
        Report(y.PA.PI)
        ' Reference type members on nested class.
        M(y.FA.FC)
        Report(y.FA.FC)
        M(y.FA.PC)
        Report(y.FA.PC)
        M(y.PA.FC)
        Report(y.PA.FC)
        M(y.PA.PC)
        Report(y.PA.PC)
        ' Value type members on nested struct.
        M(y.FT.FI)
        Report(y.FT.FI)
        M(y.FT.PI)
        Report(y.FT.PI)
        M(y.PT.FI)
        Report(y.PT.FI)
        M(y.PT.PI)
        Report(y.PT.PI)
        ' Reference type members on nested struct.
        M(y.FT.FC)
        Report(y.FT.FC)
        M(y.FT.PC)
        Report(y.FT.PC)
        M(y.PT.FC)
        Report(y.PT.FC)
        M(y.PT.PC)
        Report(y.PT.PC)
    End Sub
End Class
    </file>
</compilation>
 
            Dim compilationVerifier = CompileAndVerify(source, expectedOutput:=
            <![CDATA[M
=> 8
A.get_PI
M
A.set_PI
A.get_PI
=> 8
M
=> 5
A.get_PC
M
A.set_PC
A.get_PC
=> 5
M
=> 4
B.get_PI
M
B.set_PI
B.get_PI
=> 4
A.get_PB
M
A.get_PB
=> 4
A.get_PB
B.get_PI
M
B.set_PI
A.get_PB
B.get_PI
=> 4
M
=> 6
B.get_PC
M
B.set_PC
B.get_PC
=> 6
A.get_PB
M
A.get_PB
=> 6
A.get_PB
B.get_PC
M
B.set_PC
A.get_PB
B.get_PC
=> 6
M
=> 6
T.get_PI
M
T.set_PI
T.get_PI
=> 6
A.get_PT
M
A.get_PT
=> 5
A.get_PT
T.get_PI
M
T.set_PI
A.get_PT
T.get_PI
=> 5
M
=> 7
T.get_PC
M
T.set_PC
T.get_PC
=> 7
A.get_PT
M
A.get_PT
=> 6
A.get_PT
T.get_PC
M
T.set_PC
A.get_PT
T.get_PC
=> 6
M
=> 10
S.get_PI
M
S.set_PI
S.get_PI
=> 10
M
=> 4
S.get_PC
M
S.set_PC
S.get_PC
=> 4
M
=> 3
A.get_PI
M
A.set_PI
A.get_PI
=> 3
S.get_PA
M
S.get_PA
=> 3
S.get_PA
A.get_PI
M
A.set_PI
S.get_PA
A.get_PI
=> 3
M
=> 5
A.get_PC
M
A.set_PC
A.get_PC
=> 5
S.get_PA
M
S.get_PA
=> 5
S.get_PA
A.get_PC
M
A.set_PC
S.get_PA
A.get_PC
=> 5
M
=> 5
T.get_PI
M
T.set_PI
T.get_PI
=> 5
S.get_PT
M
S.get_PT
=> 4
S.get_PT
T.get_PI
M
T.set_PI
S.get_PT
T.get_PI
=> 4
M
=> 7
T.get_PC
M
T.set_PC
T.get_PC
=> 7
S.get_PT
M
S.get_PT
=> 6
S.get_PT
T.get_PC
M
T.set_PC
S.get_PT
T.get_PC
=> 6
]]>)
        End Sub
 
        ' Instance expressions used to reference
        ' statics should be skipped.
        <Fact>
        Public Sub PassByRefStaticFromInstance()
            Dim source =
<compilation>
    <file name="c.vb">
Imports System
Class A
    Public N As Short
    Public Sub New(i As Short)
        N = i
    End Sub
    Public Overrides Function ToString() As String
        Return N.ToString()
    End Function
End Class
Class B
    Public Shared FI As Short = 1
    Public Shared _PI As Short = 4
    Shared Property PI As Short
        Get
            Console.WriteLine("get_PI")
            Return _PI
        End Get
        Set(value As Short)
            Console.WriteLine("set_PI")
            _PI = value
        End Set
    End Property
    Public Shared FC As A = New A(7)
    Public Shared _PC As A = New A(10)
    Shared Property PC As A
        Get
            Console.WriteLine("get_PC")
            Return _PC
        End Get
        Set(value As A)
            Console.WriteLine("set_PC")
            _PC = value
        End Set
    End Property
    Public Function G() As B
        Console.WriteLine("G")
        Return Me
    End Function
End Class
Class Prog
    Shared Function F() As B
        Console.WriteLine("F")
        Return Nothing
    End Function
    Shared Sub Report(i As Integer)
        Console.WriteLine("=> {0}", i)
    End Sub
    Shared Sub Report(i As A)
        Console.WriteLine("=> {0}", i)
    End Sub
    Shared Sub M(ByRef i As Integer)
        Console.WriteLine("M")
        i = i + 1
    End Sub
    Shared Sub M(ByRef i As A)
        Console.WriteLine("M")
        i = New A(i.N + 1)
    End Sub
    Shared Sub Main()
        Dim x As B = New B()
        M(x.G().FI)
        Report(B.FI)
        M(x.G().PI)
        Report(B._PI)
        M(F().FC)
        Report(B.FC)
        M(F().PC)
        Report(B._PC)
    End Sub
End Class
    </file>
</compilation>
 
            Dim compilationVerifier = CompileAndVerify(source, expectedOutput:=
            <![CDATA[M
=> 2
get_PI
M
set_PI
=> 5
M
=> 8
get_PC
M
set_PC
=> 11
]]>)
        End Sub
 
        <Fact>
        Public Sub PassByRefArgs()
            Dim source =
<compilation>
    <file name="c.vb">
Imports System
Class Value
    Private Shared _n As Integer = 0
    Shared Function [Next]()
        _n = _n + 1
        Return _n
    End Function
End Class
Class C
    Private Shared _P
    Shared Property P(x As Object)
        Get
            Console.WriteLine("P({0}) (= {1})", x, _P)
            Return _P
        End Get
        Set(value)
            Console.WriteLine("P({0}) = {1}", x, value)
            _P = value
        End Set
    End Property
    Shared Sub Main()
        _P = Value.Next()
        F(C.P(F(C.P(Value.Next()))))
    End Sub
    Shared Function F(ByRef o)
        Console.WriteLine("F({0})", o)
        o = Value.Next()
        Return o
    End Function
End Class
    </file>
</compilation>
 
            Dim compilationVerifier = CompileAndVerify(source, expectedOutput:=
            <![CDATA[P(2) (= 1)
F(1)
P(2) = 3
P(3) (= 3)
F(3)
P(3) = 4
]]>)
            compilationVerifier.VerifyIL("C.Main",
            <![CDATA[
{
  // Code size      104 (0x68)
  .maxstack  3
  .locals init (Object V_0,
  Object V_1,
  Object V_2)
  IL_0000:  call       "Function Value.Next() As Object"
  IL_0005:  call       "Function System.Runtime.CompilerServices.RuntimeHelpers.GetObjectValue(Object) As Object"
  IL_000a:  stsfld     "C._P As Object"
  IL_000f:  call       "Function Value.Next() As Object"
  IL_0014:  dup
  IL_0015:  stloc.1
  IL_0016:  call       "Function System.Runtime.CompilerServices.RuntimeHelpers.GetObjectValue(Object) As Object"
  IL_001b:  call       "Function C.get_P(Object) As Object"
  IL_0020:  call       "Function System.Runtime.CompilerServices.RuntimeHelpers.GetObjectValue(Object) As Object"
  IL_0025:  stloc.2
  IL_0026:  ldloca.s   V_2
  IL_0028:  call       "Function C.F(ByRef Object) As Object"
  IL_002d:  ldloc.1
  IL_002e:  call       "Function System.Runtime.CompilerServices.RuntimeHelpers.GetObjectValue(Object) As Object"
  IL_0033:  ldloc.2
  IL_0034:  call       "Function System.Runtime.CompilerServices.RuntimeHelpers.GetObjectValue(Object) As Object"
  IL_0039:  call       "Sub C.set_P(Object, Object)"
  IL_003e:  dup
  IL_003f:  call       "Function System.Runtime.CompilerServices.RuntimeHelpers.GetObjectValue(Object) As Object"
  IL_0044:  call       "Function C.get_P(Object) As Object"
  IL_0049:  call       "Function System.Runtime.CompilerServices.RuntimeHelpers.GetObjectValue(Object) As Object"
  IL_004e:  stloc.0
  IL_004f:  ldloca.s   V_0
  IL_0051:  call       "Function C.F(ByRef Object) As Object"
  IL_0056:  pop
  IL_0057:  call       "Function System.Runtime.CompilerServices.RuntimeHelpers.GetObjectValue(Object) As Object"
  IL_005c:  ldloc.0
  IL_005d:  call       "Function System.Runtime.CompilerServices.RuntimeHelpers.GetObjectValue(Object) As Object"
  IL_0062:  call       "Sub C.set_P(Object, Object)"
  IL_0067:  ret
}
]]>)
        End Sub
 
        <Fact>
        Public Sub CopyBackDiagnostic1()
            Dim compilationDef =
<compilation name="VBCopyBackDiagnostic1">
    <file name="a.vb">
Module Module1
 
    Sub Main()
 
        Dim By As Byte = 53
        TestByRef(By)
 
    End Sub
 
    Sub TestByRef(ByRef a As Integer)
    End Sub
 
End Module
    </file>
</compilation>
 
            CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(
                compilationDef,
                New VisualBasicCompilationOptions(OutputKind.ConsoleApplication).WithOptionStrict(OptionStrict.Custom)).
            VerifyDiagnostics(Diagnostic(ERRID.WRN_ImplicitConversionCopyBack, "By").WithArguments("a", "Integer", "Byte"))
        End Sub
 
        <Fact>
        Public Sub Bug4275()
 
            Dim compilationDef =
<compilation name="Bug4275">
    <file name="a.vb">
Module M
    Sub Goo()
    End Sub
 
    Sub Bar(Of T)()
    End Sub
 
    Function Goo1() As Integer
        Return 0
    End Function
 
    Sub Main()
        Goo$()
        Goo$
        M.Goo$()
        M.Goo$
        Bar%(Of Integer)()
        Bar$(Of Integer)
 
        Dim x As Object
 
        x=Goo1$
    End Sub
End Module
    </file>
</compilation>
 
            CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef).
            VerifyDiagnostics(
                Diagnostic(ERRID.ERR_TypecharNoMatch2, "Goo$()").WithArguments("$", "Void"),
                Diagnostic(ERRID.ERR_TypecharNoMatch2, "Goo$").WithArguments("$", "Void"),
                Diagnostic(ERRID.ERR_TypecharNoMatch2, "M.Goo$()").WithArguments("$", "Void"),
                Diagnostic(ERRID.ERR_TypecharNoMatch2, "M.Goo$").WithArguments("$", "Void"),
                Diagnostic(ERRID.ERR_TypecharNoMatch2, "Bar%(Of Integer)()").WithArguments("%", "Void"),
                Diagnostic(ERRID.ERR_TypecharNoMatch2, "Bar$(Of Integer)").WithArguments("$", "Void"),
                Diagnostic(ERRID.ERR_TypecharNoMatch2, "Goo1$").WithArguments("$", "Integer"))
        End Sub
 
        <Fact>
        Public Sub CallGenericMethod()
            Dim compilationDef =
<compilation name="CallGenericMethod">
    <file name="a.vb">
Module M
    Sub Bar(Of T)(x as T)
        System.Console.WriteLine(x)
    End Sub
 
 
    Sub Main()
        Bar(Of Integer)("1234")
    End Sub
End Module
    </file>
</compilation>
 
            CompileAndVerify(compilationDef, expectedOutput:="1234")
        End Sub
 
        <Fact>
        Public Sub ConstructorCallDiagnostic()
            Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(
<compilation name="ConstructorCallDiagnostic">
    <file name="a.vb">
Module Module1
    Sub Main()
        Dim z1 = New TC1()
        Dim z2 = New TC1(1, 2, 3)
    End Sub
End Module
 
Class TC1
    Sub New(x As Integer)
    End Sub
    Sub New(x As Integer, y As Double)
    End Sub
End Class
    </file>
</compilation>)
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC30516: Overload resolution failed because no accessible 'New' accepts this number of arguments.
        Dim z1 = New TC1()
                     ~~~
BC30516: Overload resolution failed because no accessible 'New' accepts this number of arguments.
        Dim z2 = New TC1(1, 2, 3)
                     ~~~
</expected>)
        End Sub
 
        <WorkItem(539691, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/539691")>
        <Fact>
        Public Sub DiagnosticsOnInvalidConstructorCall()
            Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(
<compilation name="DiagnosticsOnInvalidConstructorCall">
    <file name="a.vb">
class C
   sub Goo()
      dim x = new C(4,5,6)
   end sub
end class
    </file>
</compilation>)
 
            Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single()
            Dim semanticModel = compilation.GetSemanticModel(tree)
 
            Dim objectCreationNode = tree.FindNodeOrTokenByKind(SyntaxKind.ObjectCreationExpression)
            Dim semanticInfo = semanticModel.GetSemanticInfoSummary(CType(objectCreationNode, ExpressionSyntax))
 
            Assert.Equal(CandidateReason.OverloadResolutionFailure, semanticInfo.CandidateReason)
        End Sub
 
        <Fact>
        Public Sub ByRefParamArraysFromMetadata()
            Dim source =
<compilation name="ByRefParamArraysFromMetadata">
    <file name="a.vb">
Imports System
 
Module M
 
    Sub Main()
        Test(Nothing)
    End Sub
 
    Sub Test(d0 As DelegateByRefParamArray_Base())
        Dim d1 As DelegateByRefParamArray_Base() = Nothing
 
        DelegateByRefParamArray.SubWithByRefParamArrayOfReferenceTypes_Identify_1(d0)
        Console.WriteLine(d0 Is Nothing)
 
        DelegateByRefParamArray.SubWithByRefParamArrayOfReferenceTypes_Identify_1(d1)
        Console.WriteLine(d1 Is Nothing)
 
        DelegateByRefParamArray.SubWithByRefParamArrayOfReferenceTypes_Identify_1(_d2)
        Console.WriteLine(_d2 Is Nothing)
 
        DelegateByRefParamArray.SubWithByRefParamArrayOfReferenceTypes_Identify_1(d2)
        Console.WriteLine(d2 Is Nothing)
 
        DelegateByRefParamArray.SubWithByRefParamArrayOfReferenceTypes_Identify_1((d2))
        Console.WriteLine(d2 Is Nothing)
 
        Dim d3()() As DelegateByRefParamArray_Base = New DelegateByRefParamArray_Base()() {Nothing}
 
        DelegateByRefParamArray.SubWithByRefParamArrayOfReferenceTypes_Identify_1(d3(0))
        Console.WriteLine(d3(0) Is Nothing)
    End Sub
 
    Dim _d2 As DelegateByRefParamArray_Base() = Nothing
 
    Property d2 As DelegateByRefParamArray_Base()
        Get
            Return _d2
        End Get
        Set(value As DelegateByRefParamArray_Base())
            System.Console.WriteLine("d2.Set")
            _d2 = value
        End Set
    End Property
 
End Module
    </file>
</compilation>
            Dim assemblyPath = TestReferences.SymbolsTests.DelegateImplementation.DelegateByRefParamArray
 
            CompileAndVerify(source,
                        references:={assemblyPath},
                         expectedOutput:=<![CDATA[
Called SubWithByRefParamArrayOfReferenceTypes_Identify_1.
True
Called SubWithByRefParamArrayOfReferenceTypes_Identify_1.
True
Called SubWithByRefParamArrayOfReferenceTypes_Identify_1.
True
Called SubWithByRefParamArrayOfReferenceTypes_Identify_1.
True
Called SubWithByRefParamArrayOfReferenceTypes_Identify_1.
True
Called SubWithByRefParamArrayOfReferenceTypes_Identify_1.
True
]]>)
 
        End Sub
 
        <Fact>
        Public Sub ByRefParametersOnProperties1()
            Dim source =
<compilation name="ByRefParametersOnProperties1">
    <file name="a.vb">
Option Strict On
 
Module Module1
 
    Sub Main()
        DoTest(129)
    End Sub
 
    Sub DoTest(y6 As Integer)
        Dim x As New PropertiesWithByRef()
        Dim y1 As Integer = 123
        Dim y2 As Byte = 124
        Dim z As Integer
 
        z = x.P1(y1)
        System.Console.WriteLine(y1)
        x.P1(y1) = z + 1
        System.Console.WriteLine(y1)
 
        z = x.P1(y2)
        System.Console.WriteLine(y2)
        x.P1(y2) = z + 1
        System.Console.WriteLine(y2)
 
        y3 = 125
        z = x.P1(y3)
        System.Console.WriteLine(y3)
        x.P1(y3) = z + 1
        System.Console.WriteLine(y3)
 
        y4 = 126
        z = x.P1(y4)
        System.Console.WriteLine(y4)
        x.P1(y4) = z + 1
        System.Console.WriteLine(y4)
 
        Dim t As New Test1()
        t.y5 = 127
        z = x.P1(t.y5)
        System.Console.WriteLine(t.y5)
        x.P1(t.y5) = z + 1
        System.Console.WriteLine(t.y5)
 
        Dim ar As Integer() = New Integer() {128}
        z = x.P1(ar(0))
        System.Console.WriteLine(ar(0))
        x.P1(ar(0)) = z + 1
        System.Console.WriteLine(ar(0))
 
        z = x.P1(y6)
        System.Console.WriteLine(y6)
        x.P1(y6) = z + 1
        System.Console.WriteLine(y6)
    End Sub
 
    Private _y3 As Integer
    Property y3 As Integer
        Get
            System.Console.WriteLine("Executing get_y3")
            Return _y3
        End Get
        Set(value As Integer)
            System.Console.WriteLine("Executing set_y3")
            _y3 = value
        End Set
    End Property
 
    Private y4 As Integer
 
 
End Module
 
Class Test1
    Public y5 As Integer
End Class
    </file>
</compilation>
            CompileAndVerify(source,
                        references:={TestReferences.SymbolsTests.PropertiesWithByRef},
                         expectedOutput:=<![CDATA[
get_P1(123)
123
set_P1(123)
123
get_P1(124)
124
set_P1(124)
124
Executing set_y3
Executing get_y3
get_P1(125)
Executing get_y3
125
Executing get_y3
set_P1(125)
Executing get_y3
125
get_P1(126)
126
set_P1(126)
126
get_P1(127)
127
set_P1(127)
127
get_P1(128)
128
set_P1(128)
128
get_P1(129)
129
set_P1(129)
129
]]>)
 
        End Sub
 
        <Fact>
        Public Sub ByRefParametersOnProperties2()
            Dim source =
<compilation name="ByRefParametersOnProperties2">
    <file name="a.vb">
Option Strict On
 
Module Module1
 
    Sub Main()
        Dim x As New PropertiesWithByRef()
        Dim ar As Integer() = New Integer() {1}
        DoTest(x, ar)
        System.Console.WriteLine(ar(0))
    End Sub
 
    Sub DoTest(x As PropertiesWithByRef, ar As Integer())
        PassByRef(x.P1(ar(0)), ar)
    End Sub
 
    Sub PassByRef(ByRef x As Integer, ar As Integer())
        System.Console.WriteLine("PassByRef: {0}, {1}.", x, ar(0))
    End Sub
 
End Module
    </file>
</compilation>
            Dim compilationVerifier = CompileAndVerify(source,
                        references:={TestReferences.SymbolsTests.PropertiesWithByRef},
                         expectedOutput:=<![CDATA[
get_P1(1)
PassByRef: 2, 1.
set_P1(1)
1
]]>)
 
            compilationVerifier.VerifyIL("Module1.DoTest",
            <![CDATA[
{
  // Code size       35 (0x23)
  .maxstack  4
  .locals init (Integer V_0,
  Integer V_1,
  Integer V_2)
  IL_0000:  ldarg.0
  IL_0001:  dup
  IL_0002:  ldarg.1
  IL_0003:  ldc.i4.0
  IL_0004:  ldelem.i4
  IL_0005:  dup
  IL_0006:  stloc.0
  IL_0007:  stloc.2
  IL_0008:  ldloca.s   V_2
  IL_000a:  callvirt   "Function PropertiesWithByRef.get_P1(ByRef Integer) As Integer"
  IL_000f:  stloc.1
  IL_0010:  ldloca.s   V_1
  IL_0012:  ldarg.1
  IL_0013:  call       "Sub Module1.PassByRef(ByRef Integer, Integer())"
  IL_0018:  ldloc.0
  IL_0019:  stloc.2
  IL_001a:  ldloca.s   V_2
  IL_001c:  ldloc.1
  IL_001d:  callvirt   "Sub PropertiesWithByRef.set_P1(ByRef Integer, Integer)"
  IL_0022:  ret
}
]]>)
 
        End Sub
 
        <Fact>
        Public Sub ByRefParametersOnProperties3()
            Dim source =
<compilation name="ByRefParametersOnProperties3">
    <file name="a.vb">
Option Strict On
 
Module Module1
 
    Sub Main()
        Dim x As New PropertiesWithByRef()
        Dim y As Integer = 1
 
        System.Console.WriteLine(DoTest(x, y))
    End Sub
 
    Function DoTest(x As PropertiesWithByRef, y As Integer) As Integer
        PassByRef(x.P1(y), y)
        Return y
    End Function
 
    Sub PassByRef(ByRef x As Integer, y As Integer)
        System.Console.WriteLine("PassByRef: {0}, {1}.", x, y)
    End Sub
 
End Module
    </file>
</compilation>
            Dim compilationVerifier = CompileAndVerify(source,
                        references:={TestReferences.SymbolsTests.PropertiesWithByRef},
                         expectedOutput:=<![CDATA[
get_P1(1)
PassByRef: 2, 1.
set_P1(1)
1
]]>)
 
            compilationVerifier.VerifyIL("Module1.DoTest",
            <![CDATA[
{
  // Code size       34 (0x22)
  .maxstack  4
  .locals init (Integer V_0,
  Integer V_1,
  Integer V_2)
  IL_0000:  ldarg.0
  IL_0001:  dup
  IL_0002:  ldarg.1
  IL_0003:  dup
  IL_0004:  stloc.0
  IL_0005:  stloc.2
  IL_0006:  ldloca.s   V_2
  IL_0008:  callvirt   "Function PropertiesWithByRef.get_P1(ByRef Integer) As Integer"
  IL_000d:  stloc.1
  IL_000e:  ldloca.s   V_1
  IL_0010:  ldarg.1
  IL_0011:  call       "Sub Module1.PassByRef(ByRef Integer, Integer)"
  IL_0016:  ldloc.0
  IL_0017:  stloc.2
  IL_0018:  ldloca.s   V_2
  IL_001a:  ldloc.1
  IL_001b:  callvirt   "Sub PropertiesWithByRef.set_P1(ByRef Integer, Integer)"
  IL_0020:  ldarg.1
  IL_0021:  ret
}
]]>)
 
        End Sub
 
        <Fact>
        Public Sub ByRefParametersOnProperties4()
            Dim source =
<compilation name="ByRefParametersOnProperties4">
    <file name="a.vb">
Option Strict On
 
Module Module1
 
    Sub Main()
        Dim x As New PropertiesWithByRef()
 
        System.Console.WriteLine(DoTest(x))
    End Sub
 
    Function DoTest(x As PropertiesWithByRef) As Integer
        Dim y As Integer = 1
        PassByRef(x.P1(y), y)
        Return y
    End Function
 
    Sub PassByRef(ByRef x As Integer, y As Integer)
        System.Console.WriteLine("PassByRef: {0}, {1}.", x, y)
    End Sub
 
End Module
    </file>
</compilation>
            Dim compilationVerifier = CompileAndVerify(source,
                        references:={TestReferences.SymbolsTests.PropertiesWithByRef},
                         expectedOutput:=<![CDATA[
get_P1(1)
PassByRef: 2, 1.
set_P1(1)
1
]]>)
 
            compilationVerifier.VerifyIL("Module1.DoTest",
            <![CDATA[
{
  // Code size       36 (0x24)
  .maxstack  4
  .locals init (Integer V_0, //y
  Integer V_1,
  Integer V_2,
  Integer V_3)
  IL_0000:  ldc.i4.1
  IL_0001:  stloc.0
  IL_0002:  ldarg.0
  IL_0003:  dup
  IL_0004:  ldloc.0
  IL_0005:  dup
  IL_0006:  stloc.1
  IL_0007:  stloc.3
  IL_0008:  ldloca.s   V_3
  IL_000a:  callvirt   "Function PropertiesWithByRef.get_P1(ByRef Integer) As Integer"
  IL_000f:  stloc.2
  IL_0010:  ldloca.s   V_2
  IL_0012:  ldloc.0
  IL_0013:  call       "Sub Module1.PassByRef(ByRef Integer, Integer)"
  IL_0018:  ldloc.1
  IL_0019:  stloc.3
  IL_001a:  ldloca.s   V_3
  IL_001c:  ldloc.2
  IL_001d:  callvirt   "Sub PropertiesWithByRef.set_P1(ByRef Integer, Integer)"
  IL_0022:  ldloc.0
  IL_0023:  ret
}
]]>)
 
        End Sub
 
        <Fact>
        Public Sub ByRefParametersOnProperties5()
            Dim source =
<compilation name="ByRefParametersOnProperties5">
    <file name="a.vb">
Option Strict On
 
Module Module1
 
    Sub Main()
        Dim x As New PropertiesWithByRef()
 
        DoTest(x)
        System.Console.WriteLine(y)
    End Sub
 
    Dim y As Integer = 1
 
    Sub DoTest(x As PropertiesWithByRef)
        PassByRef(x.P1(y), y)
    End Sub
 
    Sub PassByRef(ByRef x As Integer, y As Integer)
        System.Console.WriteLine("PassByRef: {0}, {1}.", x, y)
    End Sub
 
End Module
    </file>
</compilation>
            Dim compilationVerifier = CompileAndVerify(source,
                        references:={TestReferences.SymbolsTests.PropertiesWithByRef},
                         expectedOutput:=<![CDATA[
get_P1(1)
PassByRef: 2, 1.
set_P1(1)
1
]]>)
 
            compilationVerifier.VerifyIL("Module1.DoTest",
            <![CDATA[
{
  // Code size       41 (0x29)
  .maxstack  4
  .locals init (Integer V_0,
  Integer V_1,
  Integer V_2)
  IL_0000:  ldarg.0
  IL_0001:  dup
  IL_0002:  ldsfld     "Module1.y As Integer"
  IL_0007:  dup
  IL_0008:  stloc.0
  IL_0009:  stloc.2
  IL_000a:  ldloca.s   V_2
  IL_000c:  callvirt   "Function PropertiesWithByRef.get_P1(ByRef Integer) As Integer"
  IL_0011:  stloc.1
  IL_0012:  ldloca.s   V_1
  IL_0014:  ldsfld     "Module1.y As Integer"
  IL_0019:  call       "Sub Module1.PassByRef(ByRef Integer, Integer)"
  IL_001e:  ldloc.0
  IL_001f:  stloc.2
  IL_0020:  ldloca.s   V_2
  IL_0022:  ldloc.1
  IL_0023:  callvirt   "Sub PropertiesWithByRef.set_P1(ByRef Integer, Integer)"
  IL_0028:  ret
}
]]>)
 
        End Sub
 
        <Fact>
        Public Sub ByRefParametersOnProperties6()
            Dim source =
<compilation name="ByRefParametersOnProperties6">
    <file name="a.vb">
Option Strict On
 
Module Module1
 
    Sub Main()
        Dim x As New PropertiesWithByRef()
        s.y = 1
        DoTest(x)
        System.Console.WriteLine(s.y)
    End Sub
 
    Dim s As S1
 
    Sub DoTest(x As PropertiesWithByRef)
        PassByRef(x.P1(s.y), s.y)
    End Sub
 
    Sub PassByRef(ByRef x As Integer, y As Integer)
        System.Console.WriteLine("PassByRef: {0}, {1}.", x, y)
    End Sub
 
    Structure S1
        Public y As Integer
    End Structure
End Module
    </file>
</compilation>
            Dim compilationVerifier = CompileAndVerify(source,
                        references:={TestReferences.SymbolsTests.PropertiesWithByRef},
                         expectedOutput:=<![CDATA[
get_P1(1)
PassByRef: 2, 1.
set_P1(1)
1
]]>)
 
            compilationVerifier.VerifyIL("Module1.DoTest",
            <![CDATA[
{
  // Code size       51 (0x33)
  .maxstack  4
  .locals init (Integer V_0,
  Integer V_1,
  Integer V_2)
  IL_0000:  ldarg.0
  IL_0001:  dup
  IL_0002:  ldsflda    "Module1.s As Module1.S1"
  IL_0007:  ldfld      "Module1.S1.y As Integer"
  IL_000c:  dup
  IL_000d:  stloc.0
  IL_000e:  stloc.2
  IL_000f:  ldloca.s   V_2
  IL_0011:  callvirt   "Function PropertiesWithByRef.get_P1(ByRef Integer) As Integer"
  IL_0016:  stloc.1
  IL_0017:  ldloca.s   V_1
  IL_0019:  ldsflda    "Module1.s As Module1.S1"
  IL_001e:  ldfld      "Module1.S1.y As Integer"
  IL_0023:  call       "Sub Module1.PassByRef(ByRef Integer, Integer)"
  IL_0028:  ldloc.0
  IL_0029:  stloc.2
  IL_002a:  ldloca.s   V_2
  IL_002c:  ldloc.1
  IL_002d:  callvirt   "Sub PropertiesWithByRef.set_P1(ByRef Integer, Integer)"
  IL_0032:  ret
}
]]>)
 
        End Sub
 
        <Fact>
        Public Sub ByRefParametersOnProperties7()
            Dim source =
<compilation name="ByRefParametersOnProperties7">
    <file name="a.vb">
Option Strict Off
 
Module Module1
 
    Sub Main()
        DoTest(129)
    End Sub
 
    Sub DoTest(y6 As Integer)
        Dim x As New PropertiesWithByRef()
        Dim y1 As Integer = 123
        Dim y2 As Byte = 124
 
        PassByRef(x.P1(y1), y1)
        System.Console.WriteLine(y1)
 
        PassByRef(x.P1(y2), y2)
        System.Console.WriteLine(y2)
 
        y3 = 125
        PassByRef(x.P1(y3), y3)
        System.Console.WriteLine(y3)
 
        y4 = 126
        PassByRef(x.P1(y4), y4)
        System.Console.WriteLine(y4)
 
        Dim t As New Test1()
        t.y5 = 127
        PassByRef(x.P1(t.y5), t.y5)
        System.Console.WriteLine(t.y5)
 
        Dim ar As Integer() = New Integer() {128}
        PassByRef(x.P1(ar(0)), ar(0))
        System.Console.WriteLine(ar(0))
 
        PassByRef(x.P1(y6), y6)
        System.Console.WriteLine(y6)
    End Sub
 
    Sub PassByRef(ByRef x As Integer, ByRef y As Integer)
        System.Console.WriteLine("PassByRef: {0}, {1}.", x, y)
        x = x + 25
        y = y + 50
    End Sub
 
    Private _y3 As Integer
    Property y3 As Integer
        Get
            System.Console.WriteLine("Executing get_y3")
            Return _y3
        End Get
        Set(value As Integer)
            System.Console.WriteLine("Executing set_y3")
            _y3 = value
        End Set
    End Property
 
    Private y4 As Integer
 
 
End Module
 
Class Test1
    Public y5 As Integer
End Class
    </file>
</compilation>
            Dim compilationVerifier = CompileAndVerify(source,
                        references:={TestReferences.SymbolsTests.PropertiesWithByRef},
                         expectedOutput:=<![CDATA[
get_P1(123)
PassByRef: 124, 123.
set_P1(123)
173
get_P1(124)
PassByRef: 125, 124.
set_P1(124)
174
Executing set_y3
Executing get_y3
get_P1(125)
Executing get_y3
PassByRef: 126, 125.
Executing set_y3
set_P1(125)
Executing get_y3
175
get_P1(126)
PassByRef: 127, 126.
set_P1(126)
176
get_P1(127)
PassByRef: 128, 127.
set_P1(127)
177
get_P1(128)
PassByRef: 129, 128.
set_P1(128)
178
get_P1(129)
PassByRef: 130, 129.
set_P1(129)
179
]]>)
 
        End Sub
 
        <Fact>
        Public Sub MeInByRefContext1()
            Dim source =
<compilation name="MeInByRefContext1">
    <file name="a.vb">
Option Strict Off
 
Imports System
 
Module Module1
 
    Sub Main()
        Dim x As New TestStruct1(100)
        x.Test1()
        x.Test2()
 
        System.Console.WriteLine("-----")
 
        Dim y As New TestClass1(50)
        y.Test1()
        y.Test2()
        y.Test3()
    End Sub
 
    Function PassByRef0(ByRef x As Integer) As Integer
        x = x + 1
        Return x
    End Function
 
End Module
 
 
Structure TestStruct1
    Public fld1 As Integer
 
    Sub New(x As Integer)
        fld1 = x
        System.Console.WriteLine(PassByRef0(Me.fld1))
        System.Console.WriteLine(Me.fld1)
 
        System.Console.WriteLine(PassByRef1(Me))
        System.Console.WriteLine(Me.fld1)
    End Sub
 
    Sub Test1()
        System.Console.WriteLine(PassByRef0(Me.fld1))
        System.Console.WriteLine(Me.fld1)
    End Sub
 
    Sub Test2()
        System.Console.WriteLine(PassByRef1(Me))
        System.Console.WriteLine(Me.fld1)
    End Sub
 
    Shared Function PassByRef1(ByRef x As TestStruct1) As Integer
        x.fld1 = x.fld1 + 1
        Return x.fld1
    End Function
 
End Structure
 
Class TestClass1
    Public fld1 As Integer
 
    Sub New(x As Integer)
        fld1 = x
        System.Console.WriteLine(PassByRef0(Me.fld1))
        System.Console.WriteLine(Me.fld1)
 
        If x = 50 Then
            System.Console.WriteLine(PassByRef2(Me))
            System.Console.WriteLine(Me.fld1)
        End If
    End Sub
 
    Sub Test1()
        System.Console.WriteLine(PassByRef0(Me.fld1))
        System.Console.WriteLine(Me.fld1)
    End Sub
 
    Sub Test2()
        System.Console.WriteLine(PassByRef1(Me))
        System.Console.WriteLine(Me.fld1)
    End Sub
 
    Sub Test3()
        System.Console.WriteLine(PassByRef2(Me))
        System.Console.WriteLine(Me.fld1)
    End Sub
 
    Shared Function PassByRef1(ByRef x As TestClass1) As Integer
        x.fld1 = x.fld1 + 1
        Return x.fld1
    End Function
 
    Shared Function PassByRef2(ByRef x As TestClass1) As Integer
        Dim old As TestClass1 = x
        x = New TestClass1(x.fld1 + 15)
        Return old.fld1
    End Function
 
End Class
 
Structure S1
 
    Sub Test1()
        PassByRef1(Me)
    End Sub
 
    Sub Test2()
        PassByRef1((Me))
    End Sub
 
    Sub Test3()
        Me.Test1()
    End Sub
 
    Shared Sub PassByRef1(ByRef x As S1)
    End Sub
End Structure
 
Class C2
 
    Sub Test1()
        PassByRef1(Me)
    End Sub
 
    Sub Test2()
        PassByRef1((Me))
    End Sub
 
    Sub Test3()
        Me.Test1()
    End Sub
 
    Shared Sub PassByRef1(ByRef x As C2)
    End Sub
End Class
    </file>
</compilation>
            Dim compilationVerifier = CompileAndVerify(source,
                        references:={TestReferences.SymbolsTests.PropertiesWithByRef},
                         expectedOutput:=<![CDATA[
101
101
102
101
102
102
103
102
-----
51
51
67
67
51
51
52
52
53
53
69
69
53
53
]]>)
 
            compilationVerifier.VerifyIL("TestStruct1..ctor(Integer)",
            <![CDATA[
{
  // Code size       72 (0x48)
  .maxstack  2
  .locals init (TestStruct1 V_0)
  IL_0000:  ldarg.0
  IL_0001:  initobj    "TestStruct1"
  IL_0007:  ldarg.0
  IL_0008:  ldarg.1
  IL_0009:  stfld      "TestStruct1.fld1 As Integer"
  IL_000e:  ldarg.0
  IL_000f:  ldflda     "TestStruct1.fld1 As Integer"
  IL_0014:  call       "Function Module1.PassByRef0(ByRef Integer) As Integer"
  IL_0019:  call       "Sub System.Console.WriteLine(Integer)"
  IL_001e:  ldarg.0
  IL_001f:  ldfld      "TestStruct1.fld1 As Integer"
  IL_0024:  call       "Sub System.Console.WriteLine(Integer)"
  IL_0029:  ldarg.0
  IL_002a:  ldobj      "TestStruct1"
  IL_002f:  stloc.0
  IL_0030:  ldloca.s   V_0
  IL_0032:  call       "Function TestStruct1.PassByRef1(ByRef TestStruct1) As Integer"
  IL_0037:  call       "Sub System.Console.WriteLine(Integer)"
  IL_003c:  ldarg.0
  IL_003d:  ldfld      "TestStruct1.fld1 As Integer"
  IL_0042:  call       "Sub System.Console.WriteLine(Integer)"
  IL_0047:  ret
}
]]>)
 
            compilationVerifier.VerifyIL("TestStruct1.Test1",
            <![CDATA[
{
// Code size       28 (0x1c)
.maxstack  1
IL_0000:  ldarg.0
IL_0001:  ldflda     "TestStruct1.fld1 As Integer"
IL_0006:  call       "Function Module1.PassByRef0(ByRef Integer) As Integer"
IL_000b:  call       "Sub System.Console.WriteLine(Integer)"
IL_0010:  ldarg.0
IL_0011:  ldfld      "TestStruct1.fld1 As Integer"
IL_0016:  call       "Sub System.Console.WriteLine(Integer)"
IL_001b:  ret
}
]]>)
 
            compilationVerifier.VerifyIL("TestStruct1.Test2",
            <![CDATA[
{
// Code size       31 (0x1f)
.maxstack  1
.locals init (TestStruct1 V_0)
IL_0000:  ldarg.0
IL_0001:  ldobj      "TestStruct1"
IL_0006:  stloc.0
IL_0007:  ldloca.s   V_0
IL_0009:  call       "Function TestStruct1.PassByRef1(ByRef TestStruct1) As Integer"
IL_000e:  call       "Sub System.Console.WriteLine(Integer)"
IL_0013:  ldarg.0
IL_0014:  ldfld      "TestStruct1.fld1 As Integer"
IL_0019:  call       "Sub System.Console.WriteLine(Integer)"
IL_001e:  ret
}
]]>)
 
            compilationVerifier.VerifyIL("TestClass1..ctor",
            <![CDATA[
{
// Code size       71 (0x47)
.maxstack  2
.locals init (TestClass1 V_0)
IL_0000:  ldarg.0
IL_0001:  call       "Sub Object..ctor()"
IL_0006:  ldarg.0
IL_0007:  ldarg.1
IL_0008:  stfld      "TestClass1.fld1 As Integer"
IL_000d:  ldarg.0
IL_000e:  ldflda     "TestClass1.fld1 As Integer"
IL_0013:  call       "Function Module1.PassByRef0(ByRef Integer) As Integer"
IL_0018:  call       "Sub System.Console.WriteLine(Integer)"
IL_001d:  ldarg.0
IL_001e:  ldfld      "TestClass1.fld1 As Integer"
IL_0023:  call       "Sub System.Console.WriteLine(Integer)"
IL_0028:  ldarg.1
IL_0029:  ldc.i4.s   50
IL_002b:  bne.un.s   IL_0046
IL_002d:  ldarg.0
IL_002e:  stloc.0
IL_002f:  ldloca.s   V_0
IL_0031:  call       "Function TestClass1.PassByRef2(ByRef TestClass1) As Integer"
IL_0036:  call       "Sub System.Console.WriteLine(Integer)"
IL_003b:  ldarg.0
IL_003c:  ldfld      "TestClass1.fld1 As Integer"
IL_0041:  call       "Sub System.Console.WriteLine(Integer)"
IL_0046:  ret
}
]]>)
 
            compilationVerifier.VerifyIL("TestClass1.Test1",
            <![CDATA[
{
// Code size       28 (0x1c)
.maxstack  1
IL_0000:  ldarg.0
IL_0001:  ldflda     "TestClass1.fld1 As Integer"
IL_0006:  call       "Function Module1.PassByRef0(ByRef Integer) As Integer"
IL_000b:  call       "Sub System.Console.WriteLine(Integer)"
IL_0010:  ldarg.0
IL_0011:  ldfld      "TestClass1.fld1 As Integer"
IL_0016:  call       "Sub System.Console.WriteLine(Integer)"
IL_001b:  ret
}
]]>)
 
            compilationVerifier.VerifyIL("TestClass1.Test2",
            <![CDATA[
{
// Code size       26 (0x1a)
.maxstack  1
.locals init (TestClass1 V_0)
IL_0000:  ldarg.0
IL_0001:  stloc.0
IL_0002:  ldloca.s   V_0
IL_0004:  call       "Function TestClass1.PassByRef1(ByRef TestClass1) As Integer"
IL_0009:  call       "Sub System.Console.WriteLine(Integer)"
IL_000e:  ldarg.0
IL_000f:  ldfld      "TestClass1.fld1 As Integer"
IL_0014:  call       "Sub System.Console.WriteLine(Integer)"
IL_0019:  ret
}
]]>)
 
            compilationVerifier.VerifyIL("TestClass1.Test3",
            <![CDATA[
{
// Code size       26 (0x1a)
.maxstack  1
.locals init (TestClass1 V_0)
IL_0000:  ldarg.0
IL_0001:  stloc.0
IL_0002:  ldloca.s   V_0
IL_0004:  call       "Function TestClass1.PassByRef2(ByRef TestClass1) As Integer"
IL_0009:  call       "Sub System.Console.WriteLine(Integer)"
IL_000e:  ldarg.0
IL_000f:  ldfld      "TestClass1.fld1 As Integer"
IL_0014:  call       "Sub System.Console.WriteLine(Integer)"
IL_0019:  ret
}
]]>)
 
            compilationVerifier.VerifyIL("S1.Test1",
            <![CDATA[
{
  // Code size       15 (0xf)
  .maxstack  1
  .locals init (S1 V_0)
  IL_0000:  ldarg.0
  IL_0001:  ldobj      "S1"
  IL_0006:  stloc.0
  IL_0007:  ldloca.s   V_0
  IL_0009:  call       "Sub S1.PassByRef1(ByRef S1)"
  IL_000e:  ret
}
]]>)
 
            compilationVerifier.VerifyIL("S1.Test2",
            <![CDATA[
{
  // Code size       15 (0xf)
  .maxstack  1
  .locals init (S1 V_0)
  IL_0000:  ldarg.0
  IL_0001:  ldobj      "S1"
  IL_0006:  stloc.0
  IL_0007:  ldloca.s   V_0
  IL_0009:  call       "Sub S1.PassByRef1(ByRef S1)"
  IL_000e:  ret
}
]]>)
 
            compilationVerifier.VerifyIL("S1.Test3",
            <![CDATA[
{
  // Code size        7 (0x7)
  .maxstack  1
  IL_0000:  ldarg.0
  IL_0001:  call       "Sub S1.Test1()"
  IL_0006:  ret
}
]]>)
 
            compilationVerifier.VerifyIL("C2.Test1",
            <![CDATA[
{
  // Code size       10 (0xa)
  .maxstack  1
  .locals init (C2 V_0)
  IL_0000:  ldarg.0
  IL_0001:  stloc.0
  IL_0002:  ldloca.s   V_0
  IL_0004:  call       "Sub C2.PassByRef1(ByRef C2)"
  IL_0009:  ret
}
]]>)
 
            compilationVerifier.VerifyIL("C2.Test2",
            <![CDATA[
{
  // Code size       10 (0xa)
  .maxstack  1
  .locals init (C2 V_0)
  IL_0000:  ldarg.0
  IL_0001:  stloc.0
  IL_0002:  ldloca.s   V_0
  IL_0004:  call       "Sub C2.PassByRef1(ByRef C2)"
  IL_0009:  ret
}
]]>)
 
            compilationVerifier.VerifyIL("C2.Test3",
            <![CDATA[
{
  // Code size        7 (0x7)
  .maxstack  1
  IL_0000:  ldarg.0
  IL_0001:  call       "Sub C2.Test1()"
  IL_0006:  ret
}
]]>)
        End Sub
 
        <Fact>
        Public Sub Bug7195()
            Dim compilationDef =
<compilation name="Bug7195">
    <file name="a.vb">
Option Strict Off
Imports System
Module Module1
    Sub Main()
        Dim s2 As TestStruct2 = New TestStruct2()
        s2.fld2.fld1 = 1
        System.Console.WriteLine((s2).fld2.Increment())
        System.Console.WriteLine(s2.fld2.fld1)
        System.Console.WriteLine((s2.fld2).Increment())
        System.Console.WriteLine(s2.fld2.fld1)
        System.Console.WriteLine(((s2).fld2).Increment())
        System.Console.WriteLine(s2.fld2.fld1)
    End Sub
End Module
 
Structure TestStruct1
    Public fld1 As Integer
    Function Increment() As Integer
        fld1 = fld1 + 1
        Return fld1
    End Function
End Structure
Structure TestStruct2
    Public fld2 As TestStruct1
End Structure
    </file>
</compilation>
 
            CompileAndVerify(compilationDef,
                             expectedOutput:=
            <![CDATA[
2
2
3
3
4
4
]]>)
        End Sub
 
        <Fact>
        Public Sub ByRefParametersOnPropertiesInLambda1()
            Dim source =
<compilation name="ByRefParametersOnPropertiesInLambda1">
    <file name="a.vb">
Option Strict On
 
Module Module1
 
    Sub Main()
        Dim x As New PropertiesWithByRef()
        Dim y1 As Integer = 123
        Dim z As Integer
 
        Dim d1 As System.Action = Sub()
                                        z = x.P1(y1)
                                  End Sub
 
        d1()
        System.Console.WriteLine(y1)
 
        Dim d2 As System.Action = Sub()
                                        x.P1(y1) = z + 1
                                  End Sub
 
        d2()
        System.Console.WriteLine(y1)
    End Sub
End Module
    </file>
</compilation>
            CompileAndVerify(source,
                        references:={TestReferences.SymbolsTests.PropertiesWithByRef},
                         expectedOutput:=<![CDATA[
get_P1(123)
123
set_P1(123)
123
]]>)
 
        End Sub
 
        <Fact>
        Public Sub ByRefInInitializer1()
            Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(
<compilation name="ByRefInInitializer1">
    <file name="a.vb">
Class T1
    Public ReadOnly x1 As Integer
    Public ReadOnly x2 As Integer
    Public Shared ReadOnly x3 As Integer
    Public Shared ReadOnly x4 As Integer
    Public ReadOnly x5 As Integer
    Public ReadOnly x6 As Integer
    Public Shared ReadOnly x7 As Integer
    Public Shared ReadOnly x8 As Integer
    Public ReadOnly x9 As Integer
    Public Shared ReadOnly x10 As Integer
 
    Public y1 As Integer = TestByRef(x1)
    Public Shared y2 As Integer = TestByRef(x2)
 
    Public z1 As Integer = TestByRef(x3)
    Public Shared z2 As Integer = TestByRef(x4)
 
    Public Property y3 As Integer = TestByRef(x5)
    Public Shared Property y4 As Integer = TestByRef(x6)
 
    Public Property z3 As Integer = TestByRef(x7)
    Public Shared Property z4 As Integer = TestByRef(x8)
 
    Public Const y5 As Integer = TestByRef(x9).MaxValue
    Public Const y6 As Integer = TestByRef(x10).MaxValue
End Class
 
Module Module1
    Sub Main()
    End Sub
 
    Function TestByRef(ByRef x As Integer) As Integer
        x = x + 100
        Return x
    End Function
End Module
    </file>
</compilation>)
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC30369: Cannot refer to an instance member of a class from within a shared method or shared member initializer without an explicit instance of the class.
    Public Shared y2 As Integer = TestByRef(x2)
                                            ~~
BC30369: Cannot refer to an instance member of a class from within a shared method or shared member initializer without an explicit instance of the class.
    Public Shared Property y4 As Integer = TestByRef(x6)
                                                     ~~
BC30369: Cannot refer to an instance member of a class from within a shared method or shared member initializer without an explicit instance of the class.
    Public Const y5 As Integer = TestByRef(x9).MaxValue
                                           ~~
BC42025: Access of shared member, constant member, enum member or nested type through an instance; qualifying expression will not be evaluated.
    Public Const y6 As Integer = TestByRef(x10).MaxValue
                                 ~~~~~~~~~~~~~~~~~~~~~~~
</expected>)
        End Sub
 
        <Fact>
        Public Sub ByRefInInitializer2()
            Dim source =
<compilation name="ByRefInInitializer2">
    <file name="a.vb">
Imports System
 
Class T1
    Public ReadOnly x1 As Integer
    Public ReadOnly x2 As Integer
    Public Shared ReadOnly x3 As Integer
    Public Shared ReadOnly x4 As Integer
    Public ReadOnly x5 As Integer
    Public ReadOnly x6 As Integer
    Public Shared ReadOnly x7 As Integer
    Public Shared ReadOnly x8 As Integer
    Public ReadOnly x9 As Integer
    Public Shared ReadOnly x10 As Integer
 
    Public y1 As Integer = TestByRef(x1)
    'Public Shared y2 As Integer = TestByRef(x2)
 
    Public z1 As Integer = TestByRef(x3)
    Public Shared z2 As Integer = TestByRef(x4)
 
    Public Property y3 As Integer = TestByRef(x5)
    'Public Shared Property y4 As Integer = TestByRef(x6)
 
    Public Property z3 As Integer = TestByRef(x7)
    Public Shared Property z4 As Integer = TestByRef(x8)
 
    'Public Const y5 As Integer = TestByRef(x9).MaxValue
    Public Const y6 As Integer = TestByRef(x10).MaxValue
 
End Class
 
Module Module1
 
    Sub Main()
        Dim t As New T1()
 
        Console.WriteLine(t.x1)
        Console.WriteLine(t.x2)
        Console.WriteLine(T1.x3)
        Console.WriteLine(T1.x4)
        Console.WriteLine(t.x5)
        Console.WriteLine(t.x6)
        Console.WriteLine(T1.x7)
        Console.WriteLine(T1.x8)
        Console.WriteLine(t.x9)
        Console.WriteLine(T1.x10)
    End Sub
 
    Function TestByRef(ByRef x As Integer) As Integer
        x = x + 100
        Return x
    End Function
End Module
    </file>
</compilation>
            CompileAndVerify(source,
                        references:={TestReferences.SymbolsTests.PropertiesWithByRef},
                         expectedOutput:=<![CDATA[
100
0
0
100
100
0
0
100
0
0
]]>)
 
        End Sub
 
        <Fact>
        Public Sub ByRefInInitializer3()
            Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(
<compilation name="ByRefInInitializer3">
    <file name="a.vb">
Imports System
 
Class T1
    Public ReadOnly x1 As Integer
    Public ReadOnly x2 As Integer
    Public Shared ReadOnly x3 As Integer
    Public Shared ReadOnly x4 As Integer
    Public ReadOnly x5 As Integer
    Public ReadOnly x6 As Integer
    Public Shared ReadOnly x7 As Integer
    Public Shared ReadOnly x8 As Integer
    Public ReadOnly x9 As Integer
    Public Shared ReadOnly x10 As Integer
 
    Public y1 As Action = Sub() TestByRef(x1)
    Public Shared y2 As Action = Sub() TestByRef(x2)
 
    Public z1 As Action = Sub() TestByRef(x3)
    Public Shared z2 As Action = Sub() TestByRef(x4)
 
    Public Property y3 As Action = Sub() TestByRef(x5)
    Public Shared Property y4 As Action = Sub() TestByRef(x6)
 
    Public Property z3 As Action = Sub() TestByRef(x7)
    Public Shared Property z4 As Action = Sub() TestByRef(x8)
 
    Public Const y5 As Object = CType(Function() TestByRef(x9), Func(Of Integer)).Invoke().MaxValue
    Public Const y6 As Object = CType(Function() TestByRef(x10), Func(Of Integer)).Invoke().MaxValue
End Class
 
Module Module1
    Sub Main()
    End Sub
 
    Function TestByRef(ByRef x As Integer) As Integer
        x = x + 100
        Return x
    End Function
End Module
    </file>
</compilation>)
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC36602: 'ReadOnly' variable cannot be the target of an assignment in a lambda expression inside a constructor.
    Public y1 As Action = Sub() TestByRef(x1)
                                          ~~
BC30369: Cannot refer to an instance member of a class from within a shared method or shared member initializer without an explicit instance of the class.
    Public Shared y2 As Action = Sub() TestByRef(x2)
                                                 ~~
BC36602: 'ReadOnly' variable cannot be the target of an assignment in a lambda expression inside a constructor.
    Public Shared z2 As Action = Sub() TestByRef(x4)
                                                 ~~
BC36602: 'ReadOnly' variable cannot be the target of an assignment in a lambda expression inside a constructor.
    Public Property y3 As Action = Sub() TestByRef(x5)
                                                   ~~
BC30369: Cannot refer to an instance member of a class from within a shared method or shared member initializer without an explicit instance of the class.
    Public Shared Property y4 As Action = Sub() TestByRef(x6)
                                                          ~~
BC36602: 'ReadOnly' variable cannot be the target of an assignment in a lambda expression inside a constructor.
    Public Shared Property z4 As Action = Sub() TestByRef(x8)
                                                          ~~
BC30369: Cannot refer to an instance member of a class from within a shared method or shared member initializer without an explicit instance of the class.
    Public Const y5 As Object = CType(Function() TestByRef(x9), Func(Of Integer)).Invoke().MaxValue
                                                           ~~
BC36602: 'ReadOnly' variable cannot be the target of an assignment in a lambda expression inside a constructor.
    Public Const y6 As Object = CType(Function() TestByRef(x10), Func(Of Integer)).Invoke().MaxValue
                                                           ~~~
</expected>)
        End Sub
 
        <Fact>
        Public Sub NamedArgumentsAndOverriding()
            Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(
<compilation name="NamedArgumentsAndOverriding">
    <file name="a.vb">
Class Test1
    Overridable Sub Goo(x As Integer)
    End Sub
End Class
 
Class Test2
    Inherits Test1
 
    Overrides Sub Goo(y As Integer)
    End Sub
End Class
 
Class Test3
    Inherits Test2
 
    Overrides Sub Goo(z As Integer)
    End Sub
End Class
 
Module Module1
    Sub Main()
        Dim t3 As New Test3()
 
        t3.Goo(z:=1)
        t3.Goo(y:=1)
        t3.Goo(x:=1)
    End Sub
End Module
 
Namespace GenMethod4140
    Friend Module GenMethod4140mod
        Class Base
            Overridable Function fun1(Of T)(ByRef t1 As T) As Object
                Return Nothing
            End Function
            Overridable Function fun2(ByRef t1 As UShort) As Object
                Return Nothing
            End Function
        End Class
        Class Derived
            Inherits Base
            Overrides Function fun1(Of T)(ByRef t2 As T) As Object
                Return Nothing
            End Function
            Overrides Function fun2(ByRef t2 As UShort) As Object
                Return Nothing
            End Function
        End Class
 
        Sub GenMethod4140()
            Dim c3 As New Derived
 
            c3.fun1(t1:=3US)
            c3.fun2(t1:=3US)
 
        End Sub
    End Module
End Namespace
 
    </file>
</compilation>)
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC30455: Argument not specified for parameter 'z' of 'Public Overrides Sub Goo(z As Integer)'.
        t3.Goo(y:=1)
           ~~~
BC30272: 'y' is not a parameter of 'Public Overrides Sub Goo(z As Integer)'.
        t3.Goo(y:=1)
               ~
BC30455: Argument not specified for parameter 'z' of 'Public Overrides Sub Goo(z As Integer)'.
        t3.Goo(x:=1)
           ~~~
BC30272: 'x' is not a parameter of 'Public Overrides Sub Goo(z As Integer)'.
        t3.Goo(x:=1)
               ~
BC30455: Argument not specified for parameter 't2' of 'Public Overrides Function fun1(Of T)(ByRef t2 As T) As Object'.
            c3.fun1(t1:=3US)
               ~~~~
BC30272: 't1' is not a parameter of 'Public Overrides Function fun1(Of T)(ByRef t2 As T) As Object'.
            c3.fun1(t1:=3US)
                    ~~
BC30455: Argument not specified for parameter 't2' of 'Public Overrides Function fun2(ByRef t2 As UShort) As Object'.
            c3.fun2(t1:=3US)
               ~~~~
BC30272: 't1' is not a parameter of 'Public Overrides Function fun2(ByRef t2 As UShort) As Object'.
            c3.fun2(t1:=3US)
                    ~~
</expected>)
        End Sub
 
        <Fact()>
        Public Sub SharedThroughInstance1()
            Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(
<compilation name="NamedArgumentsAndOverriding">
    <file name="a.vb">
Module Module1
    Sub Main()
        Dim x As New TestC()
        x.Test(1, 2)
    End Sub
End Module
 
Class TestC
    Public Shared Sub Test(x As Integer)
    End Sub
 
    Public Shared Sub Test(x As Integer, y As Integer)
        System.Console.WriteLine("Success")
    End Sub
End Class
    </file>
</compilation>, TestOptions.ReleaseExe)
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC42025: Access of shared member, constant member, enum member or nested type through an instance; qualifying expression will not be evaluated.
        x.Test(1, 2)
        ~~~~~~
</expected>)
 
            CompileAndVerify(compilation, expectedOutput:=
            <![CDATA[
Success
]]>)
 
        End Sub
 
        <Fact()>
        Public Sub InaccessibleOverloads1()
            Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(
<compilation name="NamedArgumentsAndOverriding">
    <file name="a.vb">
Module Module1
    Sub Main()
        Dim x As New TestC()
        x.Test(1)
        x.Test(2, 1)
        x.Test()
 
        Dim d1 As System.Action(Of Integer) = AddressOf x.Test
        Dim d2 As System.Action(Of Integer, Integer) = AddressOf x.Test
        Dim d3 As System.Action = AddressOf x.Test
    End Sub
End Module
 
Class TestC
    Protected Sub Test(x As Integer)
    End Sub
 
    Protected Sub Test(x As Integer, y As Integer)
    End Sub
End Class
    </file>
</compilation>, TestOptions.ReleaseExe)
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC30390: 'TestC.Protected Sub Test(x As Integer)' is not accessible in this context because it is 'Protected'.
        x.Test(1)
        ~~~~~~
BC30390: 'TestC.Protected Sub Test(x As Integer, y As Integer)' is not accessible in this context because it is 'Protected'.
        x.Test(2, 1)
        ~~~~~~
BC30517: Overload resolution failed because no 'Test' is accessible.
        x.Test()
        ~~~~~~
BC30390: 'TestC.Protected Sub Test(x As Integer)' is not accessible in this context because it is 'Protected'.
        Dim d1 As System.Action(Of Integer) = AddressOf x.Test
                                                        ~~~~~~
BC30390: 'TestC.Protected Sub Test(x As Integer, y As Integer)' is not accessible in this context because it is 'Protected'.
        Dim d2 As System.Action(Of Integer, Integer) = AddressOf x.Test
                                                                 ~~~~~~
BC30517: Overload resolution failed because no 'Test' is accessible.
        Dim d3 As System.Action = AddressOf x.Test
                                            ~~~~~~
</expected>)
        End Sub
 
        <Fact()>
        Public Sub InaccessibleOverloads2()
            Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(
<compilation name="NamedArgumentsAndOverriding">
    <file name="a.vb">
Module Module1
    Sub Main()
        Dim x As New TestC()
        x.Test(1)
        x.Test(2, 1)
        x.Test()
 
        Dim d1 As System.Action(Of Integer) = AddressOf x.Test
        Dim d2 As System.Action(Of Integer, Integer) = AddressOf x.Test
        Dim d3 As System.Action = AddressOf x.Test
    End Sub
End Module
 
Class TestC
    Protected Shared Sub Test(x As Integer)
    End Sub
 
    Protected Shared Sub Test(x As Integer, y As Integer)
    End Sub
End Class
    </file>
</compilation>, TestOptions.ReleaseExe)
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC30390: 'TestC.Protected Shared Sub Test(x As Integer)' is not accessible in this context because it is 'Protected'.
        x.Test(1)
        ~~~~~~
BC30390: 'TestC.Protected Shared Sub Test(x As Integer, y As Integer)' is not accessible in this context because it is 'Protected'.
        x.Test(2, 1)
        ~~~~~~
BC30517: Overload resolution failed because no 'Test' is accessible.
        x.Test()
        ~~~~~~
BC30390: 'TestC.Protected Shared Sub Test(x As Integer)' is not accessible in this context because it is 'Protected'.
        Dim d1 As System.Action(Of Integer) = AddressOf x.Test
                                                        ~~~~~~
BC30390: 'TestC.Protected Shared Sub Test(x As Integer, y As Integer)' is not accessible in this context because it is 'Protected'.
        Dim d2 As System.Action(Of Integer, Integer) = AddressOf x.Test
                                                                 ~~~~~~
BC30517: Overload resolution failed because no 'Test' is accessible.
        Dim d3 As System.Action = AddressOf x.Test
                                            ~~~~~~
</expected>)
        End Sub
 
        <Fact()>
        Public Sub InaccessibleOverloads3()
            Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(
<compilation name="NamedArgumentsAndOverriding">
    <file name="a.vb">
Module Module1
    Sub Main()
        Dim x As New TestC()
        x.Test1(1)
        x.Test2(1)
 
        x.Test1(Of Integer)(1)
        x.Test2(Of Integer)(1)
 
        x.Test1(1,2)
 
        x.Test3(1)
        x.Test4(1)
 
        x.Test1(DoesntExist)
        x.Test2(DoesntExist)
 
        Dim y as Long = 0 
        x.Test5(y)
 
        Dim d1 As System.Action(Of Integer) = AddressOf x.Test1
        Dim d2 As System.Action(Of Integer) = AddressOf x.Test2
 
        Dim d3 As System.Action(Of Integer) = AddressOf x.Test1(Of Integer)
        Dim d4 As System.Action(Of Integer) = AddressOf x.Test2(Of Integer)
 
        Dim d5 As System.Action(Of Integer, Integer) = AddressOf x.Test1
 
        Dim d6 As System.Action(Of Integer) = AddressOf x.Test3
        Dim d7 As System.Action(Of Integer) = AddressOf x.Test4
 
        Dim d8 As System.Action(Of Long) = AddressOf x.Test5
 
        System.Console.WriteLine(1 + AddressOf x.Test1)
        System.Console.WriteLine(1 + AddressOf x.Test2)
    End Sub
End Module
 
Class TestC
    Protected Sub Test1(x As System.Guid)
    End Sub
 
    Protected Sub Test2(x As System.Guid)
    End Sub
 
    Protected Sub Test2(x As System.Type)
    End Sub
 
    Protected Sub Test3(Of T)(x As Integer)
    End Sub
 
    Protected Sub Test4(Of T)(x As Integer)
    End Sub
 
    Protected Sub Test4(Of T)(x As String)
    End Sub
 
    Protected Sub Test5(x As Integer)
    End Sub
 
    Protected Sub Test5(x As String)
    End Sub
End Class
    </file>
</compilation>, TestOptions.ReleaseExe)
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC30390: 'TestC.Protected Sub Test1(x As Guid)' is not accessible in this context because it is 'Protected'.
        x.Test1(1)
        ~~~~~~~
BC30311: Value of type 'Integer' cannot be converted to 'Guid'.
        x.Test1(1)
                ~
BC30517: Overload resolution failed because no 'Test2' is accessible.
        x.Test2(1)
        ~~~~~~~
BC30390: 'TestC.Protected Sub Test1(x As Guid)' is not accessible in this context because it is 'Protected'.
        x.Test1(Of Integer)(1)
        ~~~~~~~~~~~~~~~~~~~
BC32045: 'Protected Sub Test1(x As Guid)' has no type parameters and so cannot have type arguments.
        x.Test1(Of Integer)(1)
               ~~~~~~~~~~~~
BC30517: Overload resolution failed because no 'Test2' is accessible.
        x.Test2(Of Integer)(1)
        ~~~~~~~~~~~~~~~~~~~
BC30390: 'TestC.Protected Sub Test1(x As Guid)' is not accessible in this context because it is 'Protected'.
        x.Test1(1,2)
        ~~~~~~~
BC30311: Value of type 'Integer' cannot be converted to 'Guid'.
        x.Test1(1,2)
                ~
BC30057: Too many arguments to 'Protected Sub Test1(x As Guid)'.
        x.Test1(1,2)
                  ~
BC30390: 'TestC.Protected Sub Test3(Of T)(x As Integer)' is not accessible in this context because it is 'Protected'.
        x.Test3(1)
        ~~~~~~~
BC32050: Type parameter 'T' for 'Protected Sub Test3(Of T)(x As Integer)' cannot be inferred.
        x.Test3(1)
          ~~~~~
BC30517: Overload resolution failed because no 'Test4' is accessible.
        x.Test4(1)
        ~~~~~~~
BC30390: 'TestC.Protected Sub Test1(x As Guid)' is not accessible in this context because it is 'Protected'.
        x.Test1(DoesntExist)
        ~~~~~~~
BC30451: 'DoesntExist' is not declared. It may be inaccessible due to its protection level.
        x.Test1(DoesntExist)
                ~~~~~~~~~~~
BC30517: Overload resolution failed because no 'Test2' is accessible.
        x.Test2(DoesntExist)
        ~~~~~~~
BC30451: 'DoesntExist' is not declared. It may be inaccessible due to its protection level.
        x.Test2(DoesntExist)
                ~~~~~~~~~~~
BC30517: Overload resolution failed because no 'Test5' is accessible.
        x.Test5(y)
        ~~~~~~~
BC30390: 'TestC.Protected Sub Test1(x As Guid)' is not accessible in this context because it is 'Protected'.
        Dim d1 As System.Action(Of Integer) = AddressOf x.Test1
                                                        ~~~~~~~
BC31143: Method 'Protected Sub Test1(x As Guid)' does not have a signature compatible with delegate 'Delegate Sub Action(Of Integer)(obj As Integer)'.
        Dim d1 As System.Action(Of Integer) = AddressOf x.Test1
                                                        ~~~~~~~
BC30517: Overload resolution failed because no 'Test2' is accessible.
        Dim d2 As System.Action(Of Integer) = AddressOf x.Test2
                                                        ~~~~~~~
BC30390: 'TestC.Protected Sub Test1(x As Guid)' is not accessible in this context because it is 'Protected'.
        Dim d3 As System.Action(Of Integer) = AddressOf x.Test1(Of Integer)
                                                        ~~~~~~~~~~~~~~~~~~~
BC32045: 'Protected Sub Test1(x As Guid)' has no type parameters and so cannot have type arguments.
        Dim d3 As System.Action(Of Integer) = AddressOf x.Test1(Of Integer)
                                                               ~~~~~~~~~~~~
BC30517: Overload resolution failed because no 'Test2' is accessible.
        Dim d4 As System.Action(Of Integer) = AddressOf x.Test2(Of Integer)
                                                        ~~~~~~~~~~~~~~~~~~~
BC30390: 'TestC.Protected Sub Test1(x As Guid)' is not accessible in this context because it is 'Protected'.
        Dim d5 As System.Action(Of Integer, Integer) = AddressOf x.Test1
                                                                 ~~~~~~~
BC31143: Method 'Protected Sub Test1(x As Guid)' does not have a signature compatible with delegate 'Delegate Sub Action(Of Integer, Integer)(arg1 As Integer, arg2 As Integer)'.
        Dim d5 As System.Action(Of Integer, Integer) = AddressOf x.Test1
                                                                 ~~~~~~~
BC30390: 'TestC.Protected Sub Test3(Of T)(x As Integer)' is not accessible in this context because it is 'Protected'.
        Dim d6 As System.Action(Of Integer) = AddressOf x.Test3
                                                        ~~~~~~~
BC36564: Type arguments could not be inferred from the delegate.
        Dim d6 As System.Action(Of Integer) = AddressOf x.Test3
                                                        ~~~~~~~
BC30517: Overload resolution failed because no 'Test4' is accessible.
        Dim d7 As System.Action(Of Integer) = AddressOf x.Test4
                                                        ~~~~~~~
BC30517: Overload resolution failed because no 'Test5' is accessible.
        Dim d8 As System.Action(Of Long) = AddressOf x.Test5
                                                     ~~~~~~~
BC30491: Expression does not produce a value.
        System.Console.WriteLine(1 + AddressOf x.Test1)
                                     ~~~~~~~~~~~~~~~~~
BC30390: 'TestC.Protected Sub Test1(x As Guid)' is not accessible in this context because it is 'Protected'.
        System.Console.WriteLine(1 + AddressOf x.Test1)
                                               ~~~~~~~
BC30491: Expression does not produce a value.
        System.Console.WriteLine(1 + AddressOf x.Test2)
                                     ~~~~~~~~~~~~~~~~~
BC30517: Overload resolution failed because no 'Test2' is accessible.
        System.Console.WriteLine(1 + AddressOf x.Test2)
                                               ~~~~~~~
</expected>)
        End Sub
 
        <WorkItem(543719, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543719")>
        <Fact()>
        Public Sub CallByRefWithTwoArgs()
            Dim compilationDef =
<compilation name="Test.vb">
    <file name="a.vb">
Imports System
 
Module Program
    Sub SUB8(ByRef X1 As Integer, ByRef X2 As Integer)
        Console.WriteLine(X1)
        Console.WriteLine(X2)
    End Sub
 
    Sub Main(args As String())
        SUB8(10, 40)
    End Sub
End Module
    </file>
</compilation>
 
            CompileAndVerify(compilationDef,
                             expectedOutput:=
            <![CDATA[
10
40
]]>)
        End Sub
 
        <Fact, WorkItem(544511, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544511")>
        Public Sub Bug12877_1()
            Dim source =
<compilation name="AscW">
    <file name="a.vb">
Imports Microsoft.VisualBasic.Strings
 
Module Module1
 
    Sub Main()
        System.Console.WriteLine(Test1("a"c))
        System.Console.WriteLine(Test2("b"))
    End Sub
 
    Function Test1(x As Char) As Integer
        Return AscW(x)
    End Function
 
    Function Test2(x As String) As Integer
        Return AscW(x)
    End Function
 
End Module
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(source, TestOptions.ReleaseExe)
 
            Dim compilationVerifier = CompileAndVerify(compilation,
                         expectedOutput:=
            <![CDATA[
97
98
]]>)
 
            compilationVerifier.VerifyIL("Module1.Test1",
            <![CDATA[
{
  // Code size        2 (0x2)
  .maxstack  1
  IL_0000:  ldarg.0
  IL_0001:  ret
}
]]>)
 
            compilationVerifier.VerifyIL("Module1.Test2",
            <![CDATA[
{
  // Code size        7 (0x7)
  .maxstack  1
  IL_0000:  ldarg.0
  IL_0001:  call       "Function Microsoft.VisualBasic.Strings.AscW(String) As Integer"
  IL_0006:  ret
}
]]>)
 
            compilation = CreateCompilationWithMscorlib40AndReferences(source, {SystemRef}, TestOptions.ReleaseExe.WithEmbedVbCoreRuntime(True))
 
            compilationVerifier = CompileAndVerify(compilation,
                         expectedOutput:=
            <![CDATA[
97
98
]]>)
 
            compilationVerifier.VerifyIL("Module1.Test1",
            <![CDATA[
{
  // Code size        2 (0x2)
  .maxstack  1
  IL_0000:  ldarg.0
  IL_0001:  ret
}
]]>)
 
            compilationVerifier.VerifyIL("Module1.Test2",
            <![CDATA[
{
  // Code size        7 (0x7)
  .maxstack  1
  IL_0000:  ldarg.0
  IL_0001:  call       "Function Microsoft.VisualBasic.Strings.AscW(String) As Integer"
  IL_0006:  ret
}
]]>)
        End Sub
 
        <Fact, WorkItem(545521, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545521")>
        Public Sub Bug14020()
            Dim source =
<compilation name="AscW">
    <file name="a.vb">
Option Strict On
 
Class A
    Shared Sub Goo(Of T)(x As T)
        System.Console.WriteLine("Goo(Of T)(x As T)")
    End Sub
End Class
 
Class B
    Inherits A
    Overloads Shared Sub Goo(Of T)(y As Integer)
    End Sub
    Shared Sub Main()
        Goo(x:=1)
    End Sub
End Class
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(source, TestOptions.ReleaseExe)
 
            Dim compilationVerifier = CompileAndVerify(compilation,
                         expectedOutput:=
            <![CDATA[
Goo(Of T)(x As T)
]]>)
        End Sub
 
        <Fact, WorkItem(545522, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545522")>
        Public Sub Bug14021()
            Dim source =
<compilation name="AscW">
    <file name="a.vb">
        <![CDATA[
Option Strict On

Imports System.Runtime.CompilerServices

Module M
    Sub Main()
        Dim s As String = Nothing
        s.Goo(y:=1)
    End Sub

    <Extension>
    Sub Goo(x As Object, y As Integer)
        System.Console.WriteLine("Goo(x As Object, y As Integer)")
    End Sub

    <Extension>
    Sub Goo(Of T)(x As T, z As Integer)
        System.Console.WriteLine("Goo(Of T)(x As T, z As Integer)")
    End Sub
End Module
]]>
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntimeAndReferences(source, {Net40.References.SystemCore}, TestOptions.ReleaseExe)
 
            Dim compilationVerifier = CompileAndVerify(compilation,
                         expectedOutput:=
            <![CDATA[
Goo(x As Object, y As Integer)
]]>)
        End Sub
 
        <Fact, WorkItem(545522, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545522")>
        Public Sub Bug14021_2()
            Dim source =
<compilation name="AscW">
    <file name="a.vb">
        <![CDATA[
Option Strict On

Imports System.Runtime.CompilerServices

Module M
    Sub Main()
        Dim s As String = Nothing
        s.Goo(y:=1)
    End Sub

    <Extension>
    Sub Goo(x As String, z As Integer)
        System.Console.WriteLine("Goo(x As String, z As Integer)")
    End Sub

    <Extension>
    Sub Goo(x As Object, y As Integer)
        System.Console.WriteLine("Goo(x As Object, y As Integer)")
    End Sub

End Module
]]>
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntimeAndReferences(source, {Net40.References.SystemCore}, TestOptions.ReleaseExe)
 
            Dim compilationVerifier = CompileAndVerify(compilation,
                         expectedOutput:=
            <![CDATA[
Goo(x As Object, y As Integer)
]]>)
        End Sub
 
        <Fact, WorkItem(545524, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545524")>
        Public Sub Bug14024()
            Dim source =
<compilation name="AscW">
    <file name="a.vb">
        <![CDATA[
Option Strict On

Class B
    Overloads Function Goo(Of T)() As Integer
        System.Console.WriteLine("Function Goo(Of T)() As Integer")
        Return 4321
    End Function
End Class

Class C
    Inherits B
    Overloads Shared Function Goo() As Integer()
        System.Console.WriteLine("Function Goo() As Integer()")
        Return {1234}
    End Function
    Shared Sub Main()
        Goo(0).ToString()
    End Sub
End Class
    ]]>
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(source, TestOptions.ReleaseExe)
 
            Dim compilationVerifier = CompileAndVerify(compilation,
                         expectedOutput:=
            <![CDATA[
Function Goo() As Integer()
]]>)
        End Sub
 
        <Fact, WorkItem(545524, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545524")>
        Public Sub Bug14024_2()
            Dim source =
<compilation name="AscW">
    <file name="a.vb">
        <![CDATA[
Option Strict On

Class B
    Overloads Function Goo(Of T)() As Integer
        System.Console.WriteLine("Function Goo(Of T)() As Integer")
        Return 4321
    End Function
End Class

Class C
    Inherits B
    Shared Sub Main()
        Goo(0).ToString()
    End Sub
End Class
    ]]>
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(source, TestOptions.ReleaseExe)
 
            CompilationUtils.AssertTheseDiagnostics(compilation,
<expected>
BC30057: Too many arguments to 'Public Overloads Function Goo(Of T)() As Integer'.
        Goo(0).ToString()
            ~
</expected>)
 
        End Sub
 
        <Fact, WorkItem(546006, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/546006")>
        Public Sub Bug14936()
            Dim source =
<compilation name="Bug14936">
    <file name="a.vb">
        <![CDATA[
Module Program
    Sub Main()
        Dim o As New cls1
        Dim x1 As Object = 1
        o.goo(x1)
    End Sub
End Module
Class cls1
    Sub goo(ByVal x As cls1)
        System.Console.WriteLine("goo(ByVal x As cls1)")
    End Sub
    Sub goo(ByVal x As Integer)
        System.Console.WriteLine("goo(ByVal x As Integer)")
    End Sub
End Class
    ]]>
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(source, TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom))
 
            Dim compilationVerifier = CompileAndVerify(compilation,
                         expectedOutput:=
            <![CDATA[
goo(ByVal x As Integer)
]]>)
 
            AssertTheseDiagnostics(compilation,
<expected>
BC42017: Late bound resolution; runtime errors could occur.
        o.goo(x1)
          ~~~
</expected>)
        End Sub
 
        <Fact, WorkItem(547132, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/547132")>
        Public Sub Bug18047()
            Dim source =
<compilation>
    <file name="a.vb">
        <![CDATA[
Imports System
Module Program
    Property S1 As String
        Get
            Return ""
        End Get
        Set(value As String)
            Console.WriteLine("S1")
        End Set
    End Property
    Property S2 As String
        Get
            Return ""
        End Get
        Set(value As String)
            Console.WriteLine("S2")
        End Set
    End Property
    Property S3 As String
        Get
            Return ""
        End Get
        Set(value As String)
            Console.WriteLine("S3")
        End Set
    End Property
    Sub Verify1(ByRef x As String, ByRef y As String, ByRef z As String)
        x = "a"
        y = "b"
        z = "c"
    End Sub
    Sub Main(args As String())
        Verify1(S1, S2, S3)
    End Sub
End Module
    ]]>
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(source, TestOptions.ReleaseExe)
 
            Dim compilationVerifier = CompileAndVerify(compilation,
                         expectedOutput:=
            <![CDATA[
S3
S2
S1
]]>)
        End Sub
 
        <WorkItem(531448, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/531448")>
        <ConditionalFact(GetType(WindowsDesktopOnly), Reason:="https://github.com/dotnet/roslyn/issues/28044")>
        Public Sub Bug18133_1()
            Dim source =
<compilation>
    <file name="a.vb">
        <![CDATA[
Option Compare Text

Imports System
Imports Microsoft.VisualBasic

Module module1
    Sub Main(args As String())
        Console.WriteLine(InStr(1, "SSHORTDATE", "Date"))
    End Sub
End Module
    ]]>
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(source, TestOptions.ReleaseExe)
 
            Dim compilationVerifier = CompileAndVerify(compilation,
                         expectedOutput:=
            <![CDATA[
7
]]>)
        End Sub
 
        <WorkItem(531448, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/531448")>
        <ConditionalFact(GetType(WindowsDesktopOnly), Reason:="https://github.com/dotnet/roslyn/issues/28044")>
        Public Sub Bug18133_2()
            Dim source =
<compilation>
    <file name="a.vb">
        <![CDATA[
Option Compare Text

Imports System
Imports Microsoft.VisualBasic

Module module1
    Sub Main(args As String())
        Console.WriteLine(MyInStr(1, "SSHORTDATE", "Date"))
    End Sub

    Function MyInStr(Start As Integer, String1 As String, String2 As String, <CompilerServices.OptionCompareAttribute()> Optional Compare As CompareMethod = CompareMethod.Binary) As Integer
        Return InStr(Start, String1, String2, Compare)
    End Function

End Module


    ]]>
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(source, TestOptions.ReleaseExe)
 
            Dim compilationVerifier = CompileAndVerify(compilation,
                         expectedOutput:=
            <![CDATA[
0
]]>)
        End Sub
 
        <Fact, WorkItem(531413, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/531413")>
        Public Sub Bug18089()
            Dim source =
<compilation>
    <file name="a.vb">
        <![CDATA[
Friend Class Class1
    Sub New(ByVal x As Short, Optional ByVal y As Integer = 0)
        System.Console.WriteLine("1")
    End Sub

    Sub New(ByVal x As Integer, Optional ByVal y As Short = 0)
        System.Console.WriteLine("2")
    End Sub

    Shared Sub Goo(ByVal x As Short, Optional ByVal y As Integer = 0)
        System.Console.WriteLine("3")
    End Sub

    Shared Sub Goo(ByVal x As Integer, Optional ByVal y As Short = 0)
        System.Console.WriteLine("4")
    End Sub

End Class

Module Module1
    Sub Main(args As String())
        Dim x As New Class1(CShort(0), )
        Dim y As New Class1(CShort(0))

        Class1.Goo(CShort(0), )
        Class1.Goo(CShort(0))
    End Sub
End Module
    ]]>
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(source, TestOptions.ReleaseExe)
 
            Dim compilationVerifier = CompileAndVerify(compilation,
                         expectedOutput:=
            <![CDATA[
1
1
3
3
]]>)
        End Sub
 
        <Fact, WorkItem(570936, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/570936")>
        Public Sub Bug570936()
            Dim source =
<compilation>
    <file name="a.vb">
        <![CDATA[
Imports System
Imports System.Runtime.CompilerServices

Module Module1
Sub Main
    Dim x As New C3
    Dim sResult As String = x.Goo3(1)
    Console.writeline("C3 Pass")
    Console.writeline( sResult)
End Sub

Class C3
    Function Goo3(<[ParamArray]()> ByVal x As Integer) As String
        Return "C3 Fail"
    End Function
End Class
End Module
Module NonArrayMarkedAsParamArray1
    <Extension()> Function Goo3(ByVal x As C3, ByVal y As Integer) As String
        Return "C3 Pass"
    End Function
End Module
    ]]>
    </file>
</compilation>
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntimeAndReferences(source, {Net40.References.SystemCore}, TestOptions.ReleaseExe)
 
            Dim compilationVerifier = CompileAndVerify(compilation,
                         expectedOutput:=
            <![CDATA[
C3 Pass
C3 Pass
]]>)
        End Sub
 
        <Fact()>
        Public Sub ParameterSyntax_ModifiersAndAttributes()
            CompileAndVerify(
    <compilation>
        <file name="a.vb">
            <![CDATA[Imports System
Imports Microsoft.VisualBasic
Imports System.Collections
Imports System.Collections.Generic

Module Module1

    Sub main()
        Goo("test", "test2")
        Bar("Test")
        Bar("Test", 2)
        GooAttributes({"Test", "Test2"})
        GooAttributes2({"Test2", "Test"})
        GooAttributes3({"Test", "Test2"}, 1)
    End Sub

    Sub Goo(ByVal ParamArray x() As String)
        Console.WriteLine("Goo")
    End Sub

    Sub Bar(ByRef x As String, Optional ByVal y As Integer = 1)
        Console.WriteLine("Bar")
    End Sub

    Sub GooAttributes(<Test> <Test2> x() As String)
        Console.WriteLine("GooAttributes")
    End Sub

    Sub GooAttributes2(<Test, Test2> x() As String)
        Console.WriteLine("GooAttributes2")
    End Sub

    Sub GooAttributes3(<Test, Test2> x() As String, <Test> z As Integer)
        Console.WriteLine("GooAttributes3")
    End Sub
End Module

<AttributeUsageAttribute(AttributeTargets.Parameter, Inherited:=True)>
Public NotInheritable Class TestAttribute
    Inherits Attribute
End Class

<AttributeUsageAttribute(AttributeTargets.Parameter, Inherited:=True)>
Public NotInheritable Class Test2Attribute
    Inherits Attribute
End Class
]]>
        </file>
    </compilation>,
        expectedOutput:=<![CDATA[Goo
Bar
Bar
GooAttributes
GooAttributes2
GooAttributes3
]]>)
 
        End Sub
 
        <Fact()>
        Public Sub AutoImplementedPropertiesWithGenericTypeParameters()
            Dim TEMP = CompileAndVerify(
<compilation>
    <file name="a.vb">
Imports System
Imports Microsoft.VisualBasic
Imports System.Collections
Imports System.Collections.Generic
 
Module Module1
    Sub main()
        Dim x As New Goo
        x.Items = New List(Of String) From {"A", "B", "C"}
        Console.WriteLine(x.Items.Count)
 
        Dim y As New GooWithInterface
        Dim i As IPropTest = y
        i.Items = New List(Of String) From {"A", "B", "C"}
    End Sub
End Module
 
Class Goo
    Public Property Items As New List(Of String)
End Class
 
Class GooWithInterface
    Implements IPropTest
 
    Public Property Items As New List(Of String) Implements IPropTest.Items
End Class
 
Interface IPropTest
    Property Items As List(Of String)
End Interface
    </file>
</compilation>, expectedOutput:=<![CDATA[3
]]>)
        End Sub
 
        <Fact(), WorkItem(758861, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/758861")>
        Public Sub Bug758861()
 
            Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(
<compilation>
    <file name="a.vb">
Module Program
 
    Const c1 As String = "DefaultValue1"
    Const c2 As String = "DefaultValue2"
    Declare Ansi Sub subAnsiByValStr1 Lib "DeclDll" Alias "subAnsiByValStr1" (Optional ByVal str As String = c1) 'BIND1:"c1"
    Declare Ansi Function subAnsiByValStr2 Lib "DeclDll" Alias "subAnsiByValStr2" (Optional ByVal str As String = c2) 'BIND2:"c2"
 
    Sub Main(args As String())
        subAnsiByValStr1()
        subAnsiByValStr2()
    End Sub
End Module
    </file>
</compilation>, TestOptions.ReleaseDll)
 
            Dim verifier = CompileAndVerify(compilation)
 
            verifier.VerifyIL("Program.Main",
            <![CDATA[
{
  // Code size       28 (0x1c)
  .maxstack  1
  .locals init (String V_0)
  IL_0000:  ldstr      "DefaultValue1"
  IL_0005:  stloc.0
  IL_0006:  ldloca.s   V_0
  IL_0008:  call       "Declare Ansi Sub Program.subAnsiByValStr1 Lib "DeclDll" Alias "subAnsiByValStr1" (String)"
  IL_000d:  ldstr      "DefaultValue2"
  IL_0012:  stloc.0
  IL_0013:  ldloca.s   V_0
  IL_0015:  call       "Declare Ansi Function Program.subAnsiByValStr2 Lib "DeclDll" Alias "subAnsiByValStr2" (String) As Object"
  IL_001a:  pop
  IL_001b:  ret
}
]]>)
 
            Dim model = GetSemanticModel(compilation, "a.vb")
 
            Dim node1 As ExpressionSyntax = CompilationUtils.FindBindingText(Of ExpressionSyntax)(compilation, "a.vb", 1)
            Dim node2 As ExpressionSyntax = CompilationUtils.FindBindingText(Of ExpressionSyntax)(compilation, "a.vb", 2)
 
            Dim cnt = model.GetConstantValue(node1)
            Assert.Equal("DefaultValue1", CStr(cnt.Value))
 
            cnt = model.GetConstantValue(node2)
            Assert.Equal("DefaultValue2", CStr(cnt.Value))
        End Sub
 
        <Fact(), WorkItem(762717, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/762717")>
        Public Sub Bug762717()
 
            Dim library = CreateCompilationWithMscorlib40(
<compilation>
    <file name="a.vb"><![CDATA[
Public Class Test1
    Public Shared Sub Test1(a As Integer, <System.Runtime.InteropServices.OptionalAttribute> x As Integer, <System.ParamArrayAttribute> y As Integer())
    End Sub
End Class

Public Class Test2
    Public Shared Sub Test2(a As Integer, <System.Runtime.InteropServices.OptionalAttribute> x As Integer, <System.ParamArrayAttribute> y As Integer())
    End Sub
    Public Shared Sub Test2(a As String, <System.Runtime.InteropServices.OptionalAttribute> x As Integer, <System.ParamArrayAttribute> y As Integer())
    End Sub
End Class
    ]]></file>
</compilation>, options:=TestOptions.ReleaseDll)
 
            CompileAndVerify(library)
 
            Dim compilation = CreateCompilationWithMscorlib40AndReferences(
<compilation>
    <file name="a.vb"><![CDATA[
Class Module1
    Sub Main1()
    	Test1.Test1(1)
    End Sub
    Sub Main2()
    	Test2.Test2(2)
    End Sub
End Class
    ]]></file>
</compilation>, {library.EmitToImageReference()}, TestOptions.ReleaseDll)
 
            Dim verifier = CompileAndVerify(compilation)
 
            verifier.VerifyIL("Module1.Main1",
            <![CDATA[
{
  // Code size       14 (0xe)
  .maxstack  3
  IL_0000:  ldc.i4.1
  IL_0001:  ldc.i4.0
  IL_0002:  ldc.i4.0
  IL_0003:  newarr     "Integer"
  IL_0008:  call       "Sub Test1.Test1(Integer, Integer, ParamArray Integer())"
  IL_000d:  ret
}
]]>)
 
            verifier.VerifyIL("Module1.Main2",
            <![CDATA[
{
  // Code size       14 (0xe)
  .maxstack  3
  IL_0000:  ldc.i4.2
  IL_0001:  ldc.i4.0
  IL_0002:  ldc.i4.0
  IL_0003:  newarr     "Integer"
  IL_0008:  call       "Sub Test2.Test2(Integer, Integer, ParamArray Integer())"
  IL_000d:  ret
}
]]>)
        End Sub
 
        <Fact(), WorkItem(1040093, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1040093"), WorkItem(1026678, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1026678")>
        Public Sub ParenthesizedVariableAsAReceiver_01()
 
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Imports System
Imports System.Threading.Tasks
 
 
Module Module1
    Sub Main()
        System.Console.WriteLine("Non-Async")
        System.Console.WriteLine()
 
        TestLocal()
        TestParameter()
        TestSharedField()
        TestInstanceField()
        TestArrayElement()
 
        System.Console.WriteLine()
        System.Console.WriteLine("Async")
        System.Console.WriteLine()
 
        Task.WaitAll(TestLocalAsync())
        Task.WaitAll(TestParameterAsync())
        Task.WaitAll(TestSharedFieldAsync())
        Task.WaitAll(TestInstanceFieldAsync())
        Task.WaitAll(TestArrayElementAsync())
    End Sub
 
    Sub TestLocal()
        Dim l = TestStruct1.Create()
        Call (l).Change()
        System.Console.WriteLine("Local         : {0}", l.State())
    End Sub
 
    Sub TestParameter(Optional p As TestStruct1 = Nothing)
        p = TestStruct1.Create()
        Call (p).Change()
        System.Console.WriteLine("Parameter     : {0}", p.State())
    End Sub
 
    Private f As TestStruct1
    Sub TestSharedField()
        f = TestStruct1.Create()
        Call (f).Change()
        System.Console.WriteLine("Shared Field  : {0}", f.State())
    End Sub
 
    Sub TestInstanceField()
        Dim i = New TestClass()
        Call (i.fld2).Change()
        System.Console.WriteLine("Instance Field: {0}", i.fld2.State())
    End Sub
 
    Sub TestArrayElement()
        Dim a = {TestStruct1.Create()}
        Call (a(0)).Change()
        System.Console.WriteLine("Array element : {0}", a(0).State())
    End Sub
 
    Async Function DummyAsync() As Task(Of Object)
        Return Nothing
    End Function
 
    Async Function TestLocalAsync() As Task
        Dim l = TestStruct1.Create()
        Call (l).Change(Await DummyAsync())
        System.Console.WriteLine("Local         : {0}", l.State())
    End Function
 
    Async Function TestParameterAsync(Optional p As TestStruct1 = Nothing) As Task
        p = TestStruct1.Create()
        Call (p).Change(Await DummyAsync())
        System.Console.WriteLine("Parameter     : {0}", p.State())
    End Function
 
    Async Function TestSharedFieldAsync() As Task
        f = TestStruct1.Create()
        Call (f).Change(Await DummyAsync())
        System.Console.WriteLine("Shared Field  : {0}", f.State())
    End Function
 
    Async Function TestInstanceFieldAsync() As Task
        Dim i = New TestClass()
        Call (i.fld2).Change(Await DummyAsync())
        System.Console.WriteLine("Instance Field: {0}", i.fld2.State())
    End Function
 
    Async Function TestArrayElementAsync() As Task
        Dim a = {TestStruct1.Create()}
        Call (a(0)).Change(Await DummyAsync())
        System.Console.WriteLine("Array element : {0}", a(0).State())
    End Function
 
End Module
 
Structure TestStruct1
    Private fld1 As String
 
    Shared Function Create() As TestStruct1
        Return New TestStruct1() With {.fld1 = "Unchanged"}
    End Function
 
    Sub Change(Optional x As Object = Nothing)
        fld1 = "Changed"
    End Sub
 
    Function State() As String
        Return fld1
    End Function
End Structure
 
Class TestClass
    Public fld2 As TestStruct1 = TestStruct1.Create()
End Class
    </file>
</compilation>
 
            Dim compilation = CompilationUtils.CreateEmptyCompilationWithReferences(compilationDef, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe, parseOptions:=TestOptions.ReleaseExe.ParseOptions)
 
            Dim verifier = CompileAndVerify(compilation, expectedOutput:=
            <![CDATA[
Non-Async

Local         : Changed
Parameter     : Changed
Shared Field  : Changed
Instance Field: Changed
Array element : Changed

Async

Local         : Changed
Parameter     : Changed
Shared Field  : Changed
Instance Field: Changed
Array element : Changed
]]>)
        End Sub
 
        <Fact(), WorkItem(1040093, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1040093"), WorkItem(1026678, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1026678")>
        Public Sub ParenthesizedVariableAsAReceiver_02()
 
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Imports System
Imports System.Threading.Tasks
 
 
Module Module1
    Sub Main()
        System.Console.WriteLine("Non-Async")
        System.Console.WriteLine()
 
        TestLocal()
        TestParameter()
        TestSharedField()
        TestInstanceField()
        TestArrayElement()
 
        System.Console.WriteLine()
        System.Console.WriteLine("Async")
        System.Console.WriteLine()
 
        Task.WaitAll(TestLocalAsync())
        Task.WaitAll(TestParameterAsync())
        Task.WaitAll(TestSharedFieldAsync())
        Task.WaitAll(TestInstanceFieldAsync())
        Task.WaitAll(TestArrayElementAsync())
    End Sub
 
    Sub TestLocal()
        Dim l As TestStruct2
        l = TestStruct2.Create()
        Call (l).fld2.Change()
        System.Console.WriteLine("Local         : {0}", l.fld2.State())
 
        l = TestStruct2.Create()
        Call ((l).fld2).Change()
        System.Console.WriteLine("Local         : {0}", l.fld2.State())
 
        l = TestStruct2.Create()
        Call (l.fld2).Change()
        System.Console.WriteLine("Local         : {0}", l.fld2.State())
    End Sub
 
    Sub TestParameter(Optional p As TestStruct2 = Nothing)
        p = TestStruct2.Create()
        Call (p).fld2.Change()
        System.Console.WriteLine("Parameter     : {0}", p.fld2.State())
 
        p = TestStruct2.Create()
        Call ((p).fld2).Change()
        System.Console.WriteLine("Parameter     : {0}", p.fld2.State())
 
        p = TestStruct2.Create()
        Call (p.fld2).Change()
        System.Console.WriteLine("Parameter     : {0}", p.fld2.State())
    End Sub
 
    Private f As TestStruct2
    Sub TestSharedField()
        f = TestStruct2.Create()
        Call (f).fld2.Change()
        System.Console.WriteLine("Shared Field  : {0}", f.fld2.State())
 
        f = TestStruct2.Create()
        Call ((f).fld2).Change()
        System.Console.WriteLine("Shared Field  : {0}", f.fld2.State())
 
        f = TestStruct2.Create()
        Call (f.fld2).Change()
        System.Console.WriteLine("Shared Field  : {0}", f.fld2.State())
    End Sub
 
    Sub TestInstanceField()
        Dim i As TestClass
        i = New TestClass()
        Call (i).fld3.fld2.Change()
        System.Console.WriteLine("Instance Field: {0}", i.fld3.fld2.State())
 
        i = New TestClass()
        Call ((i).fld3).fld2.Change()
        System.Console.WriteLine("Instance Field: {0}", i.fld3.fld2.State())
 
        i = New TestClass()
        Call (((i).fld3).fld2).Change()
        System.Console.WriteLine("Instance Field: {0}", i.fld3.fld2.State())
 
        i = New TestClass()
        Call (i.fld3).fld2.Change()
        System.Console.WriteLine("Instance Field: {0}", i.fld3.fld2.State())
 
        i = New TestClass()
        Call ((i.fld3).fld2).Change()
        System.Console.WriteLine("Instance Field: {0}", i.fld3.fld2.State())
 
        i = New TestClass()
        Call (i.fld3.fld2).Change()
        System.Console.WriteLine("Instance Field: {0}", i.fld3.fld2.State())
    End Sub
 
    Sub TestArrayElement()
        Dim a = {TestStruct2.Create()}
        Call (a(0)).fld2.Change()
        System.Console.WriteLine("Array element : {0}", a(0).fld2.State())
 
        a = {TestStruct2.Create()}
        Call ((a(0)).fld2).Change()
        System.Console.WriteLine("Array element : {0}", a(0).fld2.State())
 
        a = {TestStruct2.Create()}
        Call (a(0).fld2).Change()
        System.Console.WriteLine("Array element : {0}", a(0).fld2.State())
    End Sub
 
    Async Function DummyAsync() As Task(Of Object)
        Return Nothing
    End Function
 
    Async Function TestLocalAsync() As Task
        Dim l As TestStruct2
        l = TestStruct2.Create()
        Call (l).fld2.Change(Await DummyAsync())
        System.Console.WriteLine("Local         : {0}", l.fld2.State())
 
        l = TestStruct2.Create()
        Call ((l).fld2).Change(Await DummyAsync())
        System.Console.WriteLine("Local         : {0}", l.fld2.State())
 
        l = TestStruct2.Create()
        Call (l.fld2).Change(Await DummyAsync())
        System.Console.WriteLine("Local         : {0}", l.fld2.State())
    End Function
 
    Async Function TestParameterAsync(Optional p As TestStruct2 = Nothing) As Task
        p = TestStruct2.Create()
        Call (p).fld2.Change(Await DummyAsync())
        System.Console.WriteLine("Parameter     : {0}", p.fld2.State())
 
        p = TestStruct2.Create()
        Call ((p).fld2).Change(Await DummyAsync())
        System.Console.WriteLine("Parameter     : {0}", p.fld2.State())
 
        p = TestStruct2.Create()
        Call (p.fld2).Change(Await DummyAsync())
        System.Console.WriteLine("Parameter     : {0}", p.fld2.State())
    End Function
 
    Async Function TestSharedFieldAsync() As Task
        f = TestStruct2.Create()
        Call (f).fld2.Change(Await DummyAsync())
        System.Console.WriteLine("Shared Field  : {0}", f.fld2.State())
 
        f = TestStruct2.Create()
        Call ((f).fld2).Change(Await DummyAsync())
        System.Console.WriteLine("Shared Field  : {0}", f.fld2.State())
 
        f = TestStruct2.Create()
        Call (f.fld2).Change(Await DummyAsync())
        System.Console.WriteLine("Shared Field  : {0}", f.fld2.State())
    End Function
 
    Async Function TestInstanceFieldAsync() As Task
        Dim i As TestClass
        i = New TestClass()
        Call (i).fld3.fld2.Change(Await DummyAsync())
        System.Console.WriteLine("Instance Field: {0}", i.fld3.fld2.State())
 
        i = New TestClass()
        Call ((i).fld3).fld2.Change(Await DummyAsync())
        System.Console.WriteLine("Instance Field: {0}", i.fld3.fld2.State())
 
        i = New TestClass()
        Call (((i).fld3).fld2).Change(Await DummyAsync())
        System.Console.WriteLine("Instance Field: {0}", i.fld3.fld2.State())
 
        i = New TestClass()
        Call (i.fld3).fld2.Change(Await DummyAsync())
        System.Console.WriteLine("Instance Field: {0}", i.fld3.fld2.State())
 
        i = New TestClass()
        Call ((i.fld3).fld2).Change(Await DummyAsync())
        System.Console.WriteLine("Instance Field: {0}", i.fld3.fld2.State())
 
        i = New TestClass()
        Call (i.fld3.fld2).Change(Await DummyAsync())
        System.Console.WriteLine("Instance Field: {0}", i.fld3.fld2.State())
    End Function
 
    Async Function TestArrayElementAsync() As Task
        Dim a = {TestStruct2.Create()}
        Call (a(0)).fld2.Change(Await DummyAsync())
        System.Console.WriteLine("Array element : {0}", a(0).fld2.State())
 
        a = {TestStruct2.Create()}
        Call ((a(0)).fld2).Change(Await DummyAsync())
        System.Console.WriteLine("Array element : {0}", a(0).fld2.State())
 
        a = {TestStruct2.Create()}
        Call (a(0).fld2).Change(Await DummyAsync())
        System.Console.WriteLine("Array element : {0}", a(0).fld2.State())
    End Function
 
End Module
 
Structure TestStruct1
    Private fld1 As String
 
    Shared Function Create() As TestStruct1
        Return New TestStruct1() With {.fld1 = "Unchanged"}
    End Function
 
    Sub Change(Optional x As Object = Nothing)
        fld1 = "Changed"
    End Sub
 
    Function State() As String
        Return fld1
    End Function
End Structure
 
Structure TestStruct2
    Public fld2 As TestStruct1
 
    Shared Function Create() As TestStruct2
        Return New TestStruct2() With {.fld2 = TestStruct1.Create()}
    End Function
 
End Structure
 
Class TestClass
    Public fld3 As TestStruct2 = TestStruct2.Create()
End Class
    </file>
</compilation>
 
            Dim compilation = CompilationUtils.CreateEmptyCompilationWithReferences(compilationDef, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe, parseOptions:=TestOptions.ReleaseExe.ParseOptions)
 
            Dim verifier = CompileAndVerify(compilation, expectedOutput:=
            <![CDATA[
Non-Async

Local         : Changed
Local         : Changed
Local         : Changed
Parameter     : Changed
Parameter     : Changed
Parameter     : Changed
Shared Field  : Changed
Shared Field  : Changed
Shared Field  : Changed
Instance Field: Changed
Instance Field: Changed
Instance Field: Changed
Instance Field: Changed
Instance Field: Changed
Instance Field: Changed
Array element : Changed
Array element : Changed
Array element : Changed

Async

Local         : Changed
Local         : Changed
Local         : Changed
Parameter     : Changed
Parameter     : Changed
Parameter     : Changed
Shared Field  : Changed
Shared Field  : Changed
Shared Field  : Changed
Instance Field: Changed
Instance Field: Changed
Instance Field: Changed
Instance Field: Changed
Instance Field: Changed
Instance Field: Changed
Array element : Changed
Array element : Changed
Array element : Changed
]]>)
        End Sub
 
        <Fact(), WorkItem(2903, "https://github.com/dotnet/roslyn/issues/2903")>
        Public Sub DelegateWithParamArray()
 
            Dim source1 =
<compilation>
    <file name="a.vb"><![CDATA[
Imports System
Public Delegate Function MessageFormatter(ByVal format As String, <[ParamArray]> args As Object()) As String
    ]]></file>
</compilation>
 
            Dim compilation1 = CreateCompilationWithMscorlib40(source1, options:=TestOptions.DebugDll)
 
            Dim source2 =
<compilation>
    <file name="a.vb"><![CDATA[
Imports System

Module Program

    Sub Main()
        Log(Function(f) f("Test {0}", 1))
        Log(Function(f) f("Test"))
        Log(Function(f) "test")
    End Sub

    Sub Log(messageFunc As Func(Of MessageFormatter, String))
        Console.WriteLine(messageFunc(New MessageFormatter(Function(format, args) String.Format(format, args))))
    End Sub

End Module
    ]]></file>
</compilation>
 
            Dim expectedOutput = <![CDATA[
Test 1
Test
test
]]>
 
            Dim compilation2 = CreateCompilationWithMscorlib40AndVBRuntimeAndReferences(source2, {compilation1.EmitToImageReference()}, options:=TestOptions.DebugExe)
 
            CompileAndVerify(compilation2, expectedOutput:=expectedOutput)
 
            Dim compilation3 = CreateCompilationWithMscorlib40AndVBRuntimeAndReferences(source2, {New VisualBasicCompilationReference(compilation1)}, options:=TestOptions.DebugExe)
 
            CompileAndVerify(compilation3, expectedOutput:=expectedOutput)
 
            Dim source4 =
<compilation>
    <file name="a.vb"><![CDATA[
Imports System

Public Delegate Function MessageFormatter(ByVal format As String, <[ParamArray]> args As Object()) As String

Module Program

    Sub Main()
        Log(Function(f) f("Test {0}", 1))
        Log(Function(f) f("Test"))
        Log(Function(f) "test")
    End Sub

    Sub Log(messageFunc As Func(Of MessageFormatter, String))
        Console.WriteLine(messageFunc(New MessageFormatter(Function(format, args) String.Format(format, args))))
    End Sub

End Module
    ]]></file>
</compilation>
 
            Dim compilation4 = CreateCompilationWithMscorlib40AndVBRuntime(source4, options:=TestOptions.DebugExe)
 
            CompileAndVerify(compilation4, expectedOutput:=expectedOutput)
 
        End Sub
 
    End Class
 
End Namespace