|
' Licensed to the .NET Foundation under one or more agreements.
' The .NET Foundation licenses this file to you under the MIT license.
' See the LICENSE file in the project root for more information.
Imports Microsoft.CodeAnalysis.Test.Utilities
Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Imports Roslyn.Test.Utilities
Imports VB = Microsoft.CodeAnalysis.VisualBasic
Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests.Semantics
Public Class MultiDimensionalTest
Inherits BasicTestBase
<Fact>
Public Sub SimpleTest()
Dim compilation1 = CreateCompilationWithMscorlib40(
<compilation name="SimpleTest">
<file name="a.vb">
Imports System
Module Program
Sub Main()
Dim myArray = New Integer(Number.One, Number.Two) {}'BIND:"New Integer(Number.One, Number.Two) {}"
End Sub
End Module
Enum Number
One
Two
End Enum
</file>
</compilation>, OutputKind.ConsoleApplication)
SemanticInfoTypeTest(compilation1, 1, "Integer(*,*)")
GetDeclareSymbolTest(compilation1, "myArray")
AnalyzeRegionDataFlowTest(compilation1, VariablesDeclaredSymbol:="myArray", ReadInsideSymbol:="", ReadOutsideSymbol:="",
WrittenInsideSymbol:="myArray", WrittenOutsideSymbol:="",
AlwaysAssignedSymbol:="myArray", DataFlowsInSymbol:="", DataFlowsOutSymbol:="")
End Sub
<Fact>
Public Sub BadDeclareTest()
Dim compilation1 = CreateCompilationWithMscorlib40(
<compilation name="BadDeclareTest">
<file name="a.vb">
Imports System
Module Program
Sub Main()
Dim m As Boolean = True
Dim arr7 As Integer(,) = New Integer(m, 4) {}' Invalid
End Sub
End Module
</file>
</compilation>, OutputKind.ConsoleApplication)
SemanticInfoTypeTest(compilation1, 1, "Integer(*,*)")
GetDeclareSymbolTest(compilation1, "arr7", 2)
AnalyzeRegionDataFlowTest(compilation1, VariablesDeclaredSymbol:="arr7", ReadInsideSymbol:="m", ReadOutsideSymbol:="",
WrittenInsideSymbol:="arr7", WrittenOutsideSymbol:="m",
AlwaysAssignedSymbol:="arr7", DataFlowsInSymbol:="m", DataFlowsOutSymbol:="", index:=2)
End Sub
<Fact>
Public Sub DifferentKindsVarAsIndex()
' Use VBRuntime so UBound is defined. Otherwise, replyCounts does not infer its type.
Dim compilation1 = CreateCompilationWithMscorlib40AndVBRuntimeAndReferences(
<compilation name="DifferentKindsVarAsIndex">
<file name="a.vb">
Option Infer On
Imports Microsoft.VisualBasic.Information
Module Program
Property prop As Integer
Sub Main()
Dim arr1(3, prop) As Integer
Dim arr2(3, fun()) As Integer
Dim temp = fun()
Dim arr3(temp, 1) As Integer
Dim x() As Integer
Dim y() As Integer
Dim replyCounts(,) = New Short(UBound(x, 1), UBound(y, 1)) {}
End Sub
Function fun() As Integer
Return 3
End Function
Sub goo(x As Integer)
Dim arr1(3, x) As Integer
End Sub
End Module
</file>
</compilation>)
SemanticInfoTypeTest(compilation1, 1, "Short(*,*)")
AnalyzeRegionDataFlowTest(compilation1, VariablesDeclaredSymbol:="arr1", ReadInsideSymbol:="", ReadOutsideSymbol:="temp, x, y",
WrittenInsideSymbol:="arr1", WrittenOutsideSymbol:="arr2, arr3, replyCounts, temp",
AlwaysAssignedSymbol:="arr1", DataFlowsInSymbol:="", DataFlowsOutSymbol:="", index:=1)
AnalyzeRegionDataFlowTest(compilation1, VariablesDeclaredSymbol:="arr2", ReadInsideSymbol:="", ReadOutsideSymbol:="temp, x, y",
WrittenInsideSymbol:="arr2", WrittenOutsideSymbol:="arr1, arr3, replyCounts, temp",
AlwaysAssignedSymbol:="arr2", DataFlowsInSymbol:="", DataFlowsOutSymbol:="", index:=2)
AnalyzeRegionDataFlowTest(compilation1, VariablesDeclaredSymbol:="arr3", ReadInsideSymbol:="temp", ReadOutsideSymbol:="x, y",
WrittenInsideSymbol:="arr3", WrittenOutsideSymbol:="arr1, arr2, replyCounts, temp",
AlwaysAssignedSymbol:="arr3", DataFlowsInSymbol:="temp", DataFlowsOutSymbol:="", index:=4)
AnalyzeRegionDataFlowTest(compilation1, VariablesDeclaredSymbol:="replyCounts", ReadInsideSymbol:="x, y", ReadOutsideSymbol:="temp",
WrittenInsideSymbol:="replyCounts", WrittenOutsideSymbol:="arr1, arr2, arr3, temp",
AlwaysAssignedSymbol:="replyCounts", DataFlowsInSymbol:="x, y", DataFlowsOutSymbol:="", index:=7)
Dim i = 1
For Each expectedName In {"arr1", "arr2", "temp", "arr3", "x", "y", "replyCounts"}
GetDeclareSymbolTest(compilation1, expectedName, i)
i += 1
Next
End Sub
<Fact>
Public Sub DifferentKindsVarAsIndex_2()
Dim compilation1 = CreateCompilationWithMscorlib40(
<compilation name="DifferentKindsVarAsIndex">
<file name="a.vb">
Option Infer On
Module Program
Property prop As Integer
Sub Main()
Dim y = 1
Dim arr5(3 + 2, If(True, y + 1, y + 2)) As Integer
End Sub
End Module
</file>
</compilation>, OutputKind.ConsoleApplication)
AnalyzeRegionDataFlowTest(compilation1, VariablesDeclaredSymbol:="arr5", ReadInsideSymbol:="y", ReadOutsideSymbol:="",
WrittenInsideSymbol:="arr5", WrittenOutsideSymbol:="y",
AlwaysAssignedSymbol:="arr5", DataFlowsInSymbol:="y", DataFlowsOutSymbol:="", index:=2)
GetDeclareSymbolTest(compilation1, "arr5", 2)
End Sub
<Fact>
Public Sub DifferentKindsVarAsIndex_3()
Dim compilation1 = CreateCompilationWithMscorlib40(
<compilation name="DifferentKindsVarAsIndex">
<file name="a.vb">
Imports Microsoft.VisualBasic.Information
Public Class Class1(Of T)
Sub goo(x As Integer(,))
Dim y = 1
Dim arr5(3 + 2, If(True, UBound(x, 1), UBound(arr5, 1))) As Integer
End Sub
End Class
</file>
</compilation>, OutputKind.ConsoleApplication)
AnalyzeRegionDataFlowTest(compilation1, VariablesDeclaredSymbol:="arr5", ReadInsideSymbol:="arr5, x", ReadOutsideSymbol:="",
WrittenInsideSymbol:="arr5", WrittenOutsideSymbol:="Me, x, y",
AlwaysAssignedSymbol:="arr5", DataFlowsInSymbol:="x", DataFlowsOutSymbol:="", index:=2)
GetDeclareSymbolTest(compilation1, "arr5", 2)
End Sub
<Fact>
Public Sub DifferentKindsVarAsIndex_4()
Dim compilation1 = CreateCompilationWithMscorlib40(
<compilation name="DifferentKindsVarAsIndex">
<file name="a.vb">
Imports Microsoft.VisualBasic.Information
Public Class Class1
Sub goo(x As Integer(,))
Dim myArray As Integer(,) = New Integer(UBound(myArray, 1), UBound(x, 1)) {}
End Sub
End Class
</file>
</compilation>, OutputKind.ConsoleApplication)
AnalyzeRegionDataFlowTest(compilation1, VariablesDeclaredSymbol:="myArray", ReadInsideSymbol:="myArray, x", ReadOutsideSymbol:="",
WrittenInsideSymbol:="myArray", WrittenOutsideSymbol:="Me, x",
AlwaysAssignedSymbol:="myArray", DataFlowsInSymbol:="x", DataFlowsOutSymbol:="", index:=1)
GetDeclareSymbolTest(compilation1, "myArray")
End Sub
<Fact>
Public Sub MultiDimensionalInArrayAnonymous()
Dim compilation1 = CreateCompilationWithMscorlib40(
<compilation name="MultiDimensionalInArrayAnonymous">
<file name="a.vb">
Option Infer On
Module Program
Sub Main()
Dim x As Integer = 1
Dim a0 = New With {
Key.b4 = New Integer(1, 2) {}, _
Key.b5 = New Integer(1, P1(x)) {{1, 2}, {2, 3}},
Key.b6 = New Integer()() {New Integer(x) {}, New Integer(2) {}},
}
End Sub
Property P1(ByVal x As Integer) As Integer
Get
Return x + 5
End Get
Set(ByVal Value As Integer)
End Set
End Property
End Module
</file>
</compilation>, OutputKind.ConsoleApplication)
SemanticInfoTypeTest(compilation1, 1, "Integer(*,*)")
AnalyzeRegionDataFlowFieldTest(compilation1, VariablesDeclaredSymbol:="", ReadInsideSymbol:="", ReadOutsideSymbol:="x",
WrittenInsideSymbol:="", WrittenOutsideSymbol:="a0, x",
AlwaysAssignedSymbol:="", DataFlowsInSymbol:="", DataFlowsOutSymbol:="", index:=1)
AnalyzeRegionDataFlowFieldTest(compilation1, VariablesDeclaredSymbol:="", ReadInsideSymbol:="x", ReadOutsideSymbol:="x",
WrittenInsideSymbol:="", WrittenOutsideSymbol:="a0, x",
AlwaysAssignedSymbol:="", DataFlowsInSymbol:="x", DataFlowsOutSymbol:="", index:=2)
AnalyzeRegionDataFlowFieldTest(compilation1, VariablesDeclaredSymbol:="", ReadInsideSymbol:="x", ReadOutsideSymbol:="x",
WrittenInsideSymbol:="", WrittenOutsideSymbol:="a0, x",
AlwaysAssignedSymbol:="", DataFlowsInSymbol:="x", DataFlowsOutSymbol:="", index:=3)
End Sub
<Fact>
Public Sub GenericAsArrayType()
Dim compilation1 = CreateCompilationWithMscorlib40(
<compilation name="GenericAsArrayType">
<file name="a.vb">
Public Class Class1(Of T)
Private Sub Goo()
Dim x As T(,) = New T(1, 2) {}
Dim Y As T(,) = New T(1, 2) {{1, 2, 3}, {1, 2, 3}} ' invalid
End Sub
End Class
</file>
</compilation>, OutputKind.ConsoleApplication)
For i As Integer = 1 To 2
SemanticInfoTypeTest(compilation1, i, "T(*,*)")
Next
AnalyzeRegionDataFlowTest(compilation1, VariablesDeclaredSymbol:="x", ReadInsideSymbol:="", ReadOutsideSymbol:="",
WrittenInsideSymbol:="x", WrittenOutsideSymbol:="Me, Y",
AlwaysAssignedSymbol:="x", DataFlowsInSymbol:="", DataFlowsOutSymbol:="")
AnalyzeRegionDataFlowTest(compilation1, VariablesDeclaredSymbol:="Y", ReadInsideSymbol:="", ReadOutsideSymbol:="",
WrittenInsideSymbol:="Y", WrittenOutsideSymbol:="Me, x",
AlwaysAssignedSymbol:="Y", DataFlowsInSymbol:="", DataFlowsOutSymbol:="", index:=2)
End Sub
<Fact>
Public Sub MixedArray()
Dim compilation1 = CreateCompilationWithMscorlib40(
<compilation name="MixedArray">
<file name="a.vb">
Imports System
Module Program
Sub Main()
Dim x = New Integer(,)() {}
End Sub
End Module
</file>
</compilation>, OutputKind.ConsoleApplication)
SemanticInfoTypeTest(compilation1, 1, "Integer(*,*)()")
GetDeclareSymbolTest(compilation1, "x")
AnalyzeRegionDataFlowTest(compilation1, VariablesDeclaredSymbol:="x", ReadInsideSymbol:="", ReadOutsideSymbol:="",
WrittenInsideSymbol:="x", WrittenOutsideSymbol:="",
AlwaysAssignedSymbol:="x", DataFlowsInSymbol:="", DataFlowsOutSymbol:="")
End Sub
<WorkItem(542531, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/542531")>
<Fact>
Public Sub AssignMultiDimArrayToArrayWithExplicitBounds()
Dim compilation1 = CreateCompilationWithMscorlib40AndVBRuntime(
<compilation>
<file name="a.vb">
Option Explicit Off
Module ArExtInitErr001
Sub Main()
Dim a5(1, 1) As Integer
Dim b5(8, ) As Integer = a5
End Sub
End Module
</file>
</compilation>).
VerifyDiagnostics(
Diagnostic(ERRID.ERR_ExpectedExpression, ""),
Diagnostic(ERRID.ERR_InitWithExplicitArraySizes, "b5(8, )"))
End Sub
#Region "HelpMethod"
Private Function SemanticInfoTypeTest(compilation As VisualBasicCompilation, index As Integer, ParamArray names As String()) As SemanticInfoSummary
Dim expression = GetSyntaxNode(Of ArrayCreationExpressionSyntax)(compilation, SyntaxKind.ArrayCreationExpression, index)
Dim model = GetModel(compilation)
Dim semanticInfo = model.GetSemanticInfoSummary(expression)
If "<nothing>" = names(0) Then
Assert.Null(semanticInfo.Type)
Else
Assert.Equal(names(0), semanticInfo.Type.ToDisplayString())
End If
If names.Count > 1 Then
Assert.Equal(names(1), semanticInfo.ConvertedType.ToDisplayString())
Assert.Equal(semanticInfo.ImplicitConversion.Kind, ConversionKind.DelegateRelaxationLevelNone)
Else
Assert.Equal(names(0), semanticInfo.ConvertedType.ToDisplayString())
Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind)
End If
Return semanticInfo
End Function
Private Function GetDeclareSymbolTest(compilation As VisualBasicCompilation, expectedSymbolName As String, Optional index As Integer = 1) As ISymbol
Dim node = GetSyntaxNode(Of VariableDeclaratorSyntax)(compilation, SyntaxKind.VariableDeclarator, index).Names.First()
Dim model = GetModel(compilation)
Dim symbol = model.GetDeclaredSymbol(node)
Assert.NotNull(symbol)
Assert.Equal(expectedSymbolName, symbol.Name)
Return symbol
End Function
Private Function AnalyzeRegionDataFlowTest(compilation As VisualBasicCompilation, VariablesDeclaredSymbol As String,
ReadInsideSymbol As String, ReadOutsideSymbol As String, WrittenInsideSymbol As String,
WrittenOutsideSymbol As String, AlwaysAssignedSymbol As String,
DataFlowsInSymbol As String, DataFlowsOutSymbol As String,
Optional index As Integer = 1) As DataFlowAnalysis
Dim node = DirectCast(GetSyntaxNode(Of VariableDeclaratorSyntax)(compilation, SyntaxKind.VariableDeclarator, index).Parent, StatementSyntax)
Dim model = GetModel(compilation)
Dim analyze = model.AnalyzeDataFlow(node, node)
Assert.Equal(VariablesDeclaredSymbol, GetSymbolNamesSortedAndJoined(analyze.VariablesDeclared))
Assert.Equal(ReadInsideSymbol, GetSymbolNamesSortedAndJoined(analyze.ReadInside))
Assert.Equal(ReadOutsideSymbol, GetSymbolNamesSortedAndJoined(analyze.ReadOutside))
Assert.Equal(WrittenInsideSymbol, GetSymbolNamesSortedAndJoined(analyze.WrittenInside))
Assert.Equal(WrittenOutsideSymbol, GetSymbolNamesSortedAndJoined(analyze.WrittenOutside))
Assert.Equal(AlwaysAssignedSymbol, GetSymbolNamesSortedAndJoined(analyze.AlwaysAssigned))
Assert.Equal(DataFlowsInSymbol, GetSymbolNamesSortedAndJoined(analyze.DataFlowsIn))
Assert.Equal(DataFlowsOutSymbol, GetSymbolNamesSortedAndJoined(analyze.DataFlowsOut))
Return analyze
End Function
Private Function AnalyzeRegionDataFlowFieldTest(compilation As VisualBasicCompilation, VariablesDeclaredSymbol As String,
ReadInsideSymbol As String, ReadOutsideSymbol As String, WrittenInsideSymbol As String,
WrittenOutsideSymbol As String, AlwaysAssignedSymbol As String,
DataFlowsInSymbol As String, DataFlowsOutSymbol As String,
Optional index As Integer = 1) As DataFlowAnalysis
Dim node = GetSyntaxNode(Of NamedFieldInitializerSyntax)(compilation, SyntaxKind.NamedFieldInitializer, index).Expression
Dim model = GetModel(compilation)
Dim analyze = model.AnalyzeDataFlow(node)
Assert.Equal(VariablesDeclaredSymbol, GetSymbolNamesSortedAndJoined(analyze.VariablesDeclared))
Assert.Equal(ReadInsideSymbol, GetSymbolNamesSortedAndJoined(analyze.ReadInside))
Assert.Equal(ReadOutsideSymbol, GetSymbolNamesSortedAndJoined(analyze.ReadOutside))
Assert.Equal(WrittenInsideSymbol, GetSymbolNamesSortedAndJoined(analyze.WrittenInside))
Assert.Equal(WrittenOutsideSymbol, GetSymbolNamesSortedAndJoined(analyze.WrittenOutside))
Assert.Equal(AlwaysAssignedSymbol, GetSymbolNamesSortedAndJoined(analyze.AlwaysAssigned))
Assert.Equal(DataFlowsInSymbol, GetSymbolNamesSortedAndJoined(analyze.DataFlowsIn))
Assert.Equal(DataFlowsOutSymbol, GetSymbolNamesSortedAndJoined(analyze.DataFlowsOut))
Return analyze
End Function
Private Function GetSymbolNamesSortedAndJoined(Of T As ISymbol)(symbols As IEnumerable(Of T)) As String
Return String.Join(", ", symbols.Select(Function(symbol) symbol.Name).OrderBy(Function(name) name))
End Function
Private Function GetModel(compilation As VisualBasicCompilation) As SemanticModel
Dim tree = compilation.SyntaxTrees.First
Dim model = compilation.GetSemanticModel(tree)
Return model
End Function
Private Function GetSyntaxNode(Of T As VisualBasicSyntaxNode)(compilation As VisualBasicCompilation, syntaxKind As SyntaxKind, index As Integer) As T
Dim tree = compilation.SyntaxTrees.First
Dim node = tree.FindNodeOrTokenByKind(syntaxKind, index).AsNode()
Dim arrayCreationExpression = TryCast(node, T)
Return arrayCreationExpression
End Function
#End Region
Private Shared ReadOnly s_arraysOfRank1IlSource As String =
<![CDATA[
.class public auto ansi beforefieldinit Test
extends [mscorlib]System.Object
{
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 1
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method Test1::.ctor
.method public hidebysig newslot virtual
instance float64[0...] Test1() cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test1"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
ldc.i4.0
ldc.i4.1
newobj instance void float64[...]::.ctor(int32, int32)
dup
ldc.i4.0
ldc.r8 -100
call instance void float64[...]::Set(int32, float64)
IL_000a: ret
} // end of method Test::Test1
.method public hidebysig newslot virtual
instance float64 Test2(float64[0...] x) cil managed
{
// Code size 11 (0xb)
.maxstack 2
IL_0000: ldstr "Test2"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
ldarg.1
ldc.i4.0
call instance float64 float64[...]::Get(int32)
IL_000a: ret
} // end of method Test::Test2
.method public hidebysig newslot virtual
instance void Test3(float64[0...] x) cil managed
{
.param [1]
.custom instance void [mscorlib]System.ParamArrayAttribute::.ctor() = ( 01 00 00 00 )
.maxstack 2
IL_000a: ret
} // end of method Test::Test3
.method public hidebysig static void M1<T>(!!T[0...] a) cil managed
{
// Code size 18 (0x12)
.maxstack 8
IL_0000: nop
IL_0001: ldtoken !!T
IL_0006: call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
IL_000b: call void [mscorlib]System.Console::WriteLine(object)
IL_0010: nop
IL_0011: ret
} // end of method M1
.method public hidebysig static void M2<T>(!!T[] a, !!T[0...] b) cil managed
{
// Code size 18 (0x12)
.maxstack 8
IL_0000: nop
IL_0001: ldtoken !!T
IL_0006: call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
IL_000b: call void [mscorlib]System.Console::WriteLine(object)
IL_0010: nop
IL_0011: ret
} // end of method M2
} // end of class Test
]]>.Value
<WorkItem(1211526, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1211526"), WorkItem(4924, "https://github.com/dotnet/roslyn/issues/4924")>
<ClrOnlyFact(ClrOnlyReason.Ilasm)>
Public Sub ArraysOfRank1_GetElement()
Dim source =
<compilation>
<file name="a.vb">
class C
Shared Sub Main()
Dim t = new Test()
System.Console.WriteLine(t.Test1()(0))
End Sub
End Class
</file>
</compilation>
Dim compilation = CreateCompilationWithCustomILSource(source, s_arraysOfRank1IlSource, options:=TestOptions.ReleaseExe)
Dim verifier = CompileAndVerify(compilation, expectedOutput:=
<![CDATA[
Test1
-100
]]>)
verifier.VerifyIL("C.Main",
<![CDATA[
{
// Code size 22 (0x16)
.maxstack 2
IL_0000: newobj "Sub Test..ctor()"
IL_0005: callvirt "Function Test.Test1() As Double(*)"
IL_000a: ldc.i4.0
IL_000b: call "Double(*).Get"
IL_0010: call "Sub System.Console.WriteLine(Double)"
IL_0015: ret
}
]]>)
End Sub
<WorkItem(1211526, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1211526"), WorkItem(4924, "https://github.com/dotnet/roslyn/issues/4924")>
<ClrOnlyFact(ClrOnlyReason.Ilasm)>
Public Sub ArraysOfRank1_SetElement()
Dim source =
<compilation>
<file name="a.vb">
class C
Shared Sub Main()
Dim t = new Test()
Dim a = t.Test1()
a(0) = 123
System.Console.WriteLine(t.Test2(a))
End Sub
End Class
</file>
</compilation>
Dim compilation = CreateCompilationWithCustomILSource(source, s_arraysOfRank1IlSource, options:=TestOptions.ReleaseExe)
Dim verifier = CompileAndVerify(Compilation, expectedOutput:=
<![CDATA[
Test1
Test2
123
]]>)
verifier.VerifyIL("C.Main",
<![CDATA[
{
// Code size 40 (0x28)
.maxstack 4
.locals init (Double(*) V_0) //a
IL_0000: newobj "Sub Test..ctor()"
IL_0005: dup
IL_0006: callvirt "Function Test.Test1() As Double(*)"
IL_000b: stloc.0
IL_000c: ldloc.0
IL_000d: ldc.i4.0
IL_000e: ldc.r8 123
IL_0017: call "Double(*).Set"
IL_001c: ldloc.0
IL_001d: callvirt "Function Test.Test2(Double(*)) As Double"
IL_0022: call "Sub System.Console.WriteLine(Double)"
IL_0027: ret
}
]]>)
End Sub
<WorkItem(1211526, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1211526"), WorkItem(4924, "https://github.com/dotnet/roslyn/issues/4924")>
<ClrOnlyFact(ClrOnlyReason.Ilasm)>
Public Sub ArraysOfRank1_ElementAddress()
Dim source =
<compilation>
<file name="a.vb">
class C
Shared Sub Main()
Dim t = new Test()
Dim a = t.Test1()
TestRef(a(0))
System.Console.WriteLine(t.Test2(a))
End Sub
Shared Sub TestRef(ByRef val As Double)
val = 123
End Sub
End Class
</file>
</compilation>
Dim compilation = CreateCompilationWithCustomILSource(source, s_arraysOfRank1IlSource, options:=TestOptions.ReleaseExe)
Dim verifier = CompileAndVerify(Compilation, expectedOutput:=
<![CDATA[
Test1
Test2
123
]]>)
verifier.VerifyIL("C.Main",
<![CDATA[
{
// Code size 36 (0x24)
.maxstack 3
.locals init (Double(*) V_0) //a
IL_0000: newobj "Sub Test..ctor()"
IL_0005: dup
IL_0006: callvirt "Function Test.Test1() As Double(*)"
IL_000b: stloc.0
IL_000c: ldloc.0
IL_000d: ldc.i4.0
IL_000e: call "Double(*).Address"
IL_0013: call "Sub C.TestRef(ByRef Double)"
IL_0018: ldloc.0
IL_0019: callvirt "Function Test.Test2(Double(*)) As Double"
IL_001e: call "Sub System.Console.WriteLine(Double)"
IL_0023: ret
}
]]>)
End Sub
<WorkItem(1211526, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1211526"), WorkItem(4924, "https://github.com/dotnet/roslyn/issues/4924")>
<Fact>
Public Sub ArraysOfRank1_Overriding01()
Dim source =
<compilation>
<file name="a.vb">
class C
Inherits Test
public overrides Function Test1() As double()
return Nothing
End Function
End Class
</file>
</compilation>
Dim compilation = CreateCompilationWithCustomILSource(source, s_arraysOfRank1IlSource, options:=TestOptions.ReleaseDll)
compilation.AssertTheseDiagnostics(
<expected>
BC30437: 'Public Overrides Function Test1() As Double()' cannot override 'Public Overridable Overloads Function Test1() As Double(*)' because they differ by their return types.
public overrides Function Test1() As double()
~~~~~
</expected>
)
End Sub
<WorkItem(1211526, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1211526"), WorkItem(4924, "https://github.com/dotnet/roslyn/issues/4924")>
<Fact>
Public Sub ArraysOfRank1_Overriding02()
Dim source =
<compilation>
<file name="a.vb">
class C
Inherits Test
public overrides Function Test2(x As double()) As Double
return x(0)
End Function
End Class
</file>
</compilation>
Dim compilation = CreateCompilationWithCustomILSource(source, s_arraysOfRank1IlSource, options:=TestOptions.ReleaseDll)
compilation.AssertTheseDiagnostics(
<expected>
BC30284: function 'Test2' cannot be declared 'Overrides' because it does not override a function in a base class.
public overrides Function Test2(x As double()) As Double
~~~~~
</expected>
)
End Sub
<WorkItem(1211526, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1211526"), WorkItem(4924, "https://github.com/dotnet/roslyn/issues/4924")>
<Fact>
Public Sub ArraysOfRank1_ArrayConversions()
Dim source =
<compilation>
<file name="a.vb">
class C
Shared Sub Main()
Dim t = new Test()
Dim a1 As double() = t.Test1()
Dim a2 As double()= CType(t.Test1(), double())
Dim a3 As System.Collections.Generic.IList(Of Double) = t.Test1()
Dim a4 As double() = Nothing
t.Test2(a4)
Dim a5 = DirectCast(t.Test1(), System.Collections.Generic.IList(Of Double))
Dim ilist As System.Collections.Generic.IList(Of Double) = new double () {}
Dim mdarray = t.Test1()
mdarray = ilist
mdarray = t.Test1()
End Sub
End Class
</file>
</compilation>
Dim compilation = CreateCompilationWithCustomILSource(source, s_arraysOfRank1IlSource, options:=TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.On))
compilation.AssertTheseDiagnostics(
<expected>
BC30311: Value of type 'Double(*)' cannot be converted to 'Double()'.
Dim a1 As double() = t.Test1()
~~~~~~~~~
BC30311: Value of type 'Double(*)' cannot be converted to 'Double()'.
Dim a2 As double()= CType(t.Test1(), double())
~~~~~~~~~
BC30311: Value of type 'Double(*)' cannot be converted to 'IList(Of Double)'.
Dim a3 As System.Collections.Generic.IList(Of Double) = t.Test1()
~~~~~~~~~
BC30311: Value of type 'Double()' cannot be converted to 'Double(*)'.
t.Test2(a4)
~~
BC30311: Value of type 'Double(*)' cannot be converted to 'IList(Of Double)'.
Dim a5 = DirectCast(t.Test1(), System.Collections.Generic.IList(Of Double))
~~~~~~~~~
BC30311: Value of type 'IList(Of Double)' cannot be converted to 'Double(*)'.
mdarray = ilist
~~~~~
</expected>
)
compilation = compilation.WithOptions(compilation.Options.WithOptionStrict(OptionStrict.Off))
compilation.AssertTheseDiagnostics(
<expected>
BC30311: Value of type 'Double(*)' cannot be converted to 'Double()'.
Dim a1 As double() = t.Test1()
~~~~~~~~~
BC30311: Value of type 'Double(*)' cannot be converted to 'Double()'.
Dim a2 As double()= CType(t.Test1(), double())
~~~~~~~~~
BC30311: Value of type 'Double(*)' cannot be converted to 'IList(Of Double)'.
Dim a3 As System.Collections.Generic.IList(Of Double) = t.Test1()
~~~~~~~~~
BC30311: Value of type 'Double()' cannot be converted to 'Double(*)'.
t.Test2(a4)
~~
BC30311: Value of type 'Double(*)' cannot be converted to 'IList(Of Double)'.
Dim a5 = DirectCast(t.Test1(), System.Collections.Generic.IList(Of Double))
~~~~~~~~~
BC30311: Value of type 'IList(Of Double)' cannot be converted to 'Double(*)'.
mdarray = ilist
~~~~~
</expected>
)
End Sub
<WorkItem(1211526, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1211526"), WorkItem(4924, "https://github.com/dotnet/roslyn/issues/4924")>
<Fact>
Public Sub ArraysOfRank1_StringConversions()
Dim ilSource As String =
<![CDATA[
.class public auto ansi beforefieldinit Test
extends [mscorlib]System.Object
{
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 1
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method Test1::.ctor
.method public hidebysig newslot virtual
instance char[0...] Test1() cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test1"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
ldc.i4.0
ldc.i4.1
newobj instance void char[...]::.ctor(int32, int32)
IL_000a: ret
} // end of method Test::Test1
.method public hidebysig newslot virtual
instance void Test2(char[0...] x) cil managed
{
// Code size 11 (0xb)
.maxstack 2
IL_0000: ldstr "Test2"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: ret
} // end of method Test::Test2
} // end of class Test
]]>.Value
Dim source =
<compilation>
<file name="a.vb">
class C
Shared Sub Main()
Dim t = new Test()
Dim a1 As String = t.Test1()
Dim a2 As String= CType(t.Test1(), String)
Dim a4 As String = Nothing
t.Test2(a4)
Dim mdarray = t.Test1()
mdarray = a4
End Sub
End Class
</file>
</compilation>
Dim compilation = CreateCompilationWithCustomILSource(source, ilSource, options:=TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.On))
compilation.AssertTheseDiagnostics(
<expected>
BC30311: Value of type 'Char(*)' cannot be converted to 'String'.
Dim a1 As String = t.Test1()
~~~~~~~~~
BC30311: Value of type 'Char(*)' cannot be converted to 'String'.
Dim a2 As String= CType(t.Test1(), String)
~~~~~~~~~
BC30311: Value of type 'String' cannot be converted to 'Char(*)'.
t.Test2(a4)
~~
BC30311: Value of type 'String' cannot be converted to 'Char(*)'.
mdarray = a4
~~
</expected>
)
compilation = compilation.WithOptions(compilation.Options.WithOptionStrict(OptionStrict.Off))
compilation.AssertTheseDiagnostics(
<expected>
BC30311: Value of type 'Char(*)' cannot be converted to 'String'.
Dim a1 As String = t.Test1()
~~~~~~~~~
BC30311: Value of type 'Char(*)' cannot be converted to 'String'.
Dim a2 As String= CType(t.Test1(), String)
~~~~~~~~~
BC30311: Value of type 'String' cannot be converted to 'Char(*)'.
t.Test2(a4)
~~
BC30311: Value of type 'String' cannot be converted to 'Char(*)'.
mdarray = a4
~~
</expected>
)
End Sub
<WorkItem(1211526, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1211526"), WorkItem(4924, "https://github.com/dotnet/roslyn/issues/4924")>
<Fact>
Public Sub ArraysOfRank1_TypeArgumentInference01()
Dim source =
<compilation>
<file name="a.vb">
class C
Shared Sub Main()
Dim t = new Test()
Dim md = t.Test1()
Dim sz = new double () {}
M1(sz)
M1(md)
M2(sz, sz)
M2(md, md)
M2(sz, md)
M2(md, sz)
M3(sz)
M3(md)
Test.M1(sz)
Test.M1(md)
Test.M2(sz, sz)
Test.M2(md, md)
Test.M2(sz, md)
Test.M2(md, sz)
End Sub
Shared Sub M1(of T)(a As T ())
End Sub
Shared Sub M2(of T)(a As T, b As T)
End Sub
Shared Sub M3(of T)(a As System.Collections.Generic.IList(Of T))
End Sub
End Class
</file>
</compilation>
Dim compilation = CreateCompilationWithCustomILSource(source, s_arraysOfRank1IlSource, options:=TestOptions.ReleaseExe)
Dim m2 = compilation.GetTypeByMetadataName("Test").GetMember(Of MethodSymbol)("M2")
Dim szArray = DirectCast(m2.Parameters.First().Type, IArrayTypeSymbol)
Assert.Equal("T()", szArray.ToTestDisplayString())
Assert.True(szArray.IsSZArray)
Assert.Equal(1, szArray.Rank)
Assert.True(szArray.Sizes.IsEmpty)
Assert.True(szArray.LowerBounds.IsDefault)
Dim mdArray = DirectCast(m2.Parameters.Last().Type, IArrayTypeSymbol)
Assert.Equal("T(*)", mdArray.ToTestDisplayString())
Assert.False(mdArray.IsSZArray)
Assert.Equal(1, mdArray.Rank)
Assert.True(mdArray.Sizes.IsEmpty)
Assert.True(mdArray.LowerBounds.IsDefault)
compilation.AssertTheseDiagnostics(
<expected>
BC36645: Data type(s) of the type parameter(s) in method 'Public Shared Sub M1(Of T)(a As T())' cannot be inferred from these arguments. Specifying the data type(s) explicitly might correct this error.
M1(md)
~~
BC36657: Data type(s) of the type parameter(s) in method 'Public Shared Sub M2(Of T)(a As T, b As T)' cannot be inferred from these arguments because they do not convert to the same type. Specifying the data type(s) explicitly might correct this error.
M2(sz, md)
~~
BC36657: Data type(s) of the type parameter(s) in method 'Public Shared Sub M2(Of T)(a As T, b As T)' cannot be inferred from these arguments because they do not convert to the same type. Specifying the data type(s) explicitly might correct this error.
M2(md, sz)
~~
BC36645: Data type(s) of the type parameter(s) in method 'Public Shared Sub M3(Of T)(a As IList(Of T))' cannot be inferred from these arguments. Specifying the data type(s) explicitly might correct this error.
M3(md)
~~
BC36645: Data type(s) of the type parameter(s) in method 'Public Shared Overloads Sub M1(Of T)(a As T(*))' cannot be inferred from these arguments. Specifying the data type(s) explicitly might correct this error.
Test.M1(sz)
~~
BC36645: Data type(s) of the type parameter(s) in method 'Public Shared Overloads Sub M2(Of T)(a As T(), b As T(*))' cannot be inferred from these arguments. Specifying the data type(s) explicitly might correct this error.
Test.M2(sz, sz)
~~
BC36645: Data type(s) of the type parameter(s) in method 'Public Shared Overloads Sub M2(Of T)(a As T(), b As T(*))' cannot be inferred from these arguments. Specifying the data type(s) explicitly might correct this error.
Test.M2(md, md)
~~
BC36645: Data type(s) of the type parameter(s) in method 'Public Shared Overloads Sub M2(Of T)(a As T(), b As T(*))' cannot be inferred from these arguments. Specifying the data type(s) explicitly might correct this error.
Test.M2(md, sz)
~~
</expected>
)
End Sub
<WorkItem(1211526, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1211526"), WorkItem(4924, "https://github.com/dotnet/roslyn/issues/4924")>
<ClrOnlyFact(ClrOnlyReason.Ilasm)>
Public Sub ArraysOfRank1_TypeArgumentInference02()
Dim source =
<compilation>
<file name="a.vb">
class C
Shared Sub Main()
Dim t = new Test()
Dim md = t.Test1()
Dim sz = new double () {}
M2(md, md)
Test.M1(md)
Test.M2(sz, md)
End Sub
Shared Sub M2(Of T)(a As T, b As T)
System.Console.WriteLine(GetType(T))
End Sub
End Class
</file>
</compilation>
Dim compilation = CreateCompilationWithCustomILSource(source, s_arraysOfRank1IlSource, options:=TestOptions.ReleaseExe)
CompileAndVerify(compilation, expectedOutput:=
<![CDATA[
Test1
System.Double[*]
System.Double
System.Double
]]>)
End Sub
<WorkItem(1211526, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1211526"), WorkItem(4924, "https://github.com/dotnet/roslyn/issues/4924")>
<Fact>
Public Sub ArraysOfRank1_TypeArgumentInference03()
Dim ilSource As String =
<![CDATA[
.class public auto ansi beforefieldinit Test
extends [mscorlib]System.Object
{
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 1
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method Test1::.ctor
.method public hidebysig static void M1<T>(!!T[0...][] a) cil managed
{
.param [1]
.custom instance void [mscorlib]System.ParamArrayAttribute::.ctor() = ( 01 00 00 00 )
IL_0011: ret
} // end of method M1
.method public hidebysig static void M2<T>(!!T[][0...] a) cil managed
{
.param [1]
.custom instance void [mscorlib]System.ParamArrayAttribute::.ctor() = ( 01 00 00 00 )
IL_0011: ret
} // end of method M1
.method public hidebysig static void M3<T>(!!T[0...][0...] a) cil managed
{
.param [1]
.custom instance void [mscorlib]System.ParamArrayAttribute::.ctor() = ( 01 00 00 00 )
IL_0011: ret
} // end of method M1
.method public hidebysig static float64[0...][] Test1() cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldnull
IL_000a: ret
} // end of method Test::Test1
.method public hidebysig static float64[][0...] Test2() cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldnull
IL_000a: ret
} // end of method Test::Test2
} // end of class Test
]]>.Value
Dim source =
<compilation>
<file name="a.vb">
class C
Shared Sub Main()
Test.M1(new Double()() {})
Test.M2(new Double()() {})
Test.M3(new Double()() {})
Test.M2(Test.Test1())
Test.M3(Test.Test1())
Test.M3(Test.Test2())
End Sub
End Class
</file>
</compilation>
Dim compilation = CreateCompilationWithCustomILSource(source, ilSource, options:=TestOptions.ReleaseExe)
compilation.AssertTheseDiagnostics(
<expected>
BC32050: Type parameter 'T' for 'Public Shared Overloads Sub M1(Of T)(ParamArray a As T()(*))' cannot be inferred.
Test.M1(new Double()() {})
~~
BC32050: Type parameter 'T' for 'Public Shared Overloads Sub M2(Of T)(ParamArray a As T(*)())' cannot be inferred.
Test.M2(new Double()() {})
~~
BC32050: Type parameter 'T' for 'Public Shared Overloads Sub M3(Of T)(ParamArray a As T(*)(*))' cannot be inferred.
Test.M3(new Double()() {})
~~
BC32050: Type parameter 'T' for 'Public Shared Overloads Sub M2(Of T)(ParamArray a As T(*)())' cannot be inferred.
Test.M2(Test.Test1())
~~
BC32050: Type parameter 'T' for 'Public Shared Overloads Sub M3(Of T)(ParamArray a As T(*)(*))' cannot be inferred.
Test.M3(Test.Test1())
~~
BC32050: Type parameter 'T' for 'Public Shared Overloads Sub M3(Of T)(ParamArray a As T(*)(*))' cannot be inferred.
Test.M3(Test.Test2())
~~
</expected>
)
End Sub
<WorkItem(1211526, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1211526"), WorkItem(4924, "https://github.com/dotnet/roslyn/issues/4924")>
<ClrOnlyFact(ClrOnlyReason.Ilasm)>
Public Sub ArraysOfRank1_TypeArgumentInference04()
Dim ilSource As String =
<![CDATA[
.class public auto ansi beforefieldinit Test
extends [mscorlib]System.Object
{
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 1
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method Test1::.ctor
.method public hidebysig static void M1<T>(!!T[0...][] a) cil managed
{
.param [1]
.custom instance void [mscorlib]System.ParamArrayAttribute::.ctor() = ( 01 00 00 00 )
.maxstack 8
IL_0000: nop
IL_0001: ldtoken !!T
IL_0006: call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
IL_000b: call void [mscorlib]System.Console::WriteLine(object)
IL_0010: nop
IL_0011: ret
} // end of method M1
.method public hidebysig static void M2<T>(!!T[][0...] a) cil managed
{
.param [1]
.custom instance void [mscorlib]System.ParamArrayAttribute::.ctor() = ( 01 00 00 00 )
.maxstack 8
IL_0000: nop
IL_0001: ldtoken !!T
IL_0006: call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
IL_000b: call void [mscorlib]System.Console::WriteLine(object)
IL_0010: nop
IL_0011: ret
} // end of method M1
.method public hidebysig static float64[0...][] Test1() cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldnull
IL_000a: ret
} // end of method Test::Test1
.method public hidebysig static float64[][0...] Test2() cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldnull
IL_000a: ret
} // end of method Test::Test2
} // end of class Test
]]>.Value
Dim source =
<compilation>
<file name="a.vb">
class C
Shared Sub Main()
Test.M1(Test.Test1())
Test.M1(Test.Test2())
Test.M2(Test.Test2())
End Sub
End Class
</file>
</compilation>
Dim compilation = CreateCompilationWithCustomILSource(source, ilSource, options:=TestOptions.ReleaseExe)
CompileAndVerify(compilation, expectedOutput:=
<![CDATA[
System.Double
System.Double[]
System.Double
]]>)
End Sub
<WorkItem(1211526, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1211526"), WorkItem(4924, "https://github.com/dotnet/roslyn/issues/4924")>
<ClrOnlyFact(ClrOnlyReason.Ilasm)>
Public Sub ArraysOfRank1_ForEach()
Dim source =
<compilation>
<file name="a.vb">
class C
Shared Sub Main()
Dim t = new Test()
for each d in t.Test1()
System.Console.WriteLine(d)
Next
End Sub
End Class
</file>
</compilation>
Dim compilation = CreateCompilationWithCustomILSource(source, s_arraysOfRank1IlSource, options:=TestOptions.ReleaseExe, includeVbRuntime:=True)
Dim verifier = CompileAndVerify(compilation, expectedOutput:=
<![CDATA[
Test1
-100
]]>)
verifier.VerifyIL("C.Main",
<![CDATA[
{
// Code size 43 (0x2b)
.maxstack 1
.locals init (System.Collections.IEnumerator V_0)
IL_0000: newobj "Sub Test..ctor()"
IL_0005: callvirt "Function Test.Test1() As Double(*)"
IL_000a: callvirt "Function System.Array.GetEnumerator() As System.Collections.IEnumerator"
IL_000f: stloc.0
IL_0010: br.s IL_0022
IL_0012: ldloc.0
IL_0013: callvirt "Function System.Collections.IEnumerator.get_Current() As Object"
IL_0018: call "Function Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble(Object) As Double"
IL_001d: call "Sub System.Console.WriteLine(Double)"
IL_0022: ldloc.0
IL_0023: callvirt "Function System.Collections.IEnumerator.MoveNext() As Boolean"
IL_0028: brtrue.s IL_0012
IL_002a: ret
}
]]>)
Dim tree = verifier.Compilation.SyntaxTrees.Single()
Dim model = verifier.Compilation.GetSemanticModel(tree)
Dim foreachSyntax = tree.GetRoot().DescendantNodes().OfType(Of ForEachStatementSyntax)().Single()
Dim info As ForEachStatementInfo = model.GetForEachStatementInfo(foreachSyntax)
Assert.Equal("Function System.Array.GetEnumerator() As System.Collections.IEnumerator", info.GetEnumeratorMethod.ToTestDisplayString())
Assert.Equal("ReadOnly Property System.Collections.IEnumerator.Current As System.Object", info.CurrentProperty.ToTestDisplayString())
Assert.Equal("System.Double", info.ElementType.ToTestDisplayString())
Assert.Equal(ConversionKind.NarrowingValue, info.CurrentConversion.Kind)
Assert.Null(info.CurrentConversion.Method)
Assert.Equal(ConversionKind.Identity, info.ElementConversion.Kind)
Assert.Null(info.ElementConversion.Method)
End Sub
<WorkItem(1211526, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1211526"), WorkItem(4924, "https://github.com/dotnet/roslyn/issues/4924")>
<ClrOnlyFact(ClrOnlyReason.Ilasm)>
Public Sub ArraysOfRank1_Length()
Dim source =
<compilation>
<file name="a.vb">
class C
Shared Sub Main()
Dim t = new Test()
System.Console.WriteLine(t.Test1().Length)
End Sub
End Class
</file>
</compilation>
Dim compilation = CreateCompilationWithCustomILSource(source, s_arraysOfRank1IlSource, options:=TestOptions.ReleaseExe)
Dim verifier = CompileAndVerify(compilation, expectedOutput:=
<![CDATA[
Test1
1
]]>)
verifier.VerifyIL("C.Main",
<![CDATA[
{
// Code size 21 (0x15)
.maxstack 1
IL_0000: newobj "Sub Test..ctor()"
IL_0005: callvirt "Function Test.Test1() As Double(*)"
IL_000a: callvirt "Function System.Array.get_Length() As Integer"
IL_000f: call "Sub System.Console.WriteLine(Integer)"
IL_0014: ret
}
]]>)
End Sub
<WorkItem(1211526, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1211526"), WorkItem(4924, "https://github.com/dotnet/roslyn/issues/4924")>
<ClrOnlyFact(ClrOnlyReason.Ilasm)>
Public Sub ArraysOfRank1_LongLength()
Dim source =
<compilation>
<file name="a.vb">
class C
Shared Sub Main()
Dim t = new Test()
System.Console.WriteLine(t.Test1().LongLength)
End Sub
End Class
</file>
</compilation>
Dim compilation = CreateCompilationWithCustomILSource(source, s_arraysOfRank1IlSource, options:=TestOptions.ReleaseExe)
Dim verifier = CompileAndVerify(compilation, expectedOutput:=
<![CDATA[
Test1
1
]]>)
verifier.VerifyIL("C.Main",
<![CDATA[
{
// Code size 21 (0x15)
.maxstack 1
IL_0000: newobj "Sub Test..ctor()"
IL_0005: callvirt "Function Test.Test1() As Double(*)"
IL_000a: callvirt "Function System.Array.get_LongLength() As Long"
IL_000f: call "Sub System.Console.WriteLine(Long)"
IL_0014: ret
}
]]>)
End Sub
<WorkItem(1211526, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1211526"), WorkItem(4924, "https://github.com/dotnet/roslyn/issues/4924")>
<Fact>
Public Sub ArraysOfRank1_ParamArray()
Dim source =
<compilation>
<file name="a.vb">
class C
Shared Sub Main()
Dim t = new Test()
Dim d as double = 1.1
t.Test3(d)
t.Test3(new double () { d })
End Sub
End Class
</file>
</compilation>
Dim compilation = CreateCompilationWithCustomILSource(source, s_arraysOfRank1IlSource, options:=TestOptions.ReleaseDll)
compilation.AssertTheseDiagnostics(
<expected>
BC31092: ParamArray parameters must have an array type.
t.Test3(d)
~~~~~
BC31092: ParamArray parameters must have an array type.
t.Test3(new double () { d })
~~~~~
</expected>
)
End Sub
<WorkItem(1211526, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1211526"), WorkItem(4924, "https://github.com/dotnet/roslyn/issues/4924")>
<ClrOnlyFact(ClrOnlyReason.Ilasm)>
Public Sub ArraysOfRank1_Redim01()
Dim source =
<compilation>
<file name="a.vb">
class C
Shared Sub Main()
Dim t = new Test()
Dim a = t.Test1()
System.Console.WriteLine(a.GetType())
System.Console.WriteLine(a.Length)
Redim a(1)
System.Console.WriteLine(a.GetType())
System.Console.WriteLine(a.Length)
End Sub
End Class
</file>
</compilation>
Dim compilation = CreateCompilationWithCustomILSource(source, s_arraysOfRank1IlSource, options:=TestOptions.ReleaseExe)
Dim verifier = CompileAndVerify(compilation, expectedOutput:=
<![CDATA[
Test1
System.Double[]
1
System.Double[]
2
]]>)
verifier.VerifyIL("C.Main",
<![CDATA[
{
// Code size 59 (0x3b)
.maxstack 2
IL_0000: newobj "Sub Test..ctor()"
IL_0005: callvirt "Function Test.Test1() As Double(*)"
IL_000a: dup
IL_000b: callvirt "Function Object.GetType() As System.Type"
IL_0010: call "Sub System.Console.WriteLine(Object)"
IL_0015: callvirt "Function System.Array.get_Length() As Integer"
IL_001a: call "Sub System.Console.WriteLine(Integer)"
IL_001f: ldc.i4.2
IL_0020: newobj "Double(*)..ctor"
IL_0025: dup
IL_0026: callvirt "Function Object.GetType() As System.Type"
IL_002b: call "Sub System.Console.WriteLine(Object)"
IL_0030: callvirt "Function System.Array.get_Length() As Integer"
IL_0035: call "Sub System.Console.WriteLine(Integer)"
IL_003a: ret
}
]]>)
End Sub
<WorkItem(1211526, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1211526"), WorkItem(4924, "https://github.com/dotnet/roslyn/issues/4924")>
<ClrOnlyFact(ClrOnlyReason.Ilasm)>
Public Sub ArraysOfRank1_Redim02()
Dim source =
<compilation>
<file name="a.vb">
class C
Shared Sub Main()
Dim t = new Test()
Dim a = t.Test1()
System.Console.WriteLine(a.GetType())
System.Console.WriteLine(a.Length)
System.Console.WriteLine(a(0))
Redim Preserve a(1)
System.Console.WriteLine(a.GetType())
System.Console.WriteLine(a.Length)
System.Console.WriteLine(a(0))
End Sub
End Class
</file>
</compilation>
Dim compilation = CreateCompilationWithCustomILSource(source, s_arraysOfRank1IlSource, options:=TestOptions.ReleaseExe, includeVbRuntime:=True)
Dim verifier = CompileAndVerify(compilation, expectedOutput:=
<![CDATA[
Test1
System.Double[]
1
-100
System.Double[]
2
-100
]]>)
verifier.VerifyIL("C.Main",
<![CDATA[
{
// Code size 94 (0x5e)
.maxstack 3
IL_0000: newobj "Sub Test..ctor()"
IL_0005: callvirt "Function Test.Test1() As Double(*)"
IL_000a: dup
IL_000b: callvirt "Function Object.GetType() As System.Type"
IL_0010: call "Sub System.Console.WriteLine(Object)"
IL_0015: dup
IL_0016: callvirt "Function System.Array.get_Length() As Integer"
IL_001b: call "Sub System.Console.WriteLine(Integer)"
IL_0020: dup
IL_0021: ldc.i4.0
IL_0022: call "Double(*).Get"
IL_0027: call "Sub System.Console.WriteLine(Double)"
IL_002c: ldc.i4.2
IL_002d: newobj "Double(*)..ctor"
IL_0032: call "Function Microsoft.VisualBasic.CompilerServices.Utils.CopyArray(System.Array, System.Array) As System.Array"
IL_0037: castclass "Double(*)"
IL_003c: dup
IL_003d: callvirt "Function Object.GetType() As System.Type"
IL_0042: call "Sub System.Console.WriteLine(Object)"
IL_0047: dup
IL_0048: callvirt "Function System.Array.get_Length() As Integer"
IL_004d: call "Sub System.Console.WriteLine(Integer)"
IL_0052: ldc.i4.0
IL_0053: call "Double(*).Get"
IL_0058: call "Sub System.Console.WriteLine(Double)"
IL_005d: ret
}
]]>)
End Sub
<WorkItem(1211526, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1211526"), WorkItem(4924, "https://github.com/dotnet/roslyn/issues/4924")>
<Fact>
Public Sub ArraysOfRank1_Redim03()
Dim source =
<compilation>
<file name="a.vb">
class C
Shared Sub Main()
Dim t = new Test()
Dim a = t.Test1()
Redim a(1, 2)
End Sub
End Class
</file>
</compilation>
Dim compilation = CreateCompilationWithCustomILSource(source, s_arraysOfRank1IlSource, options:=TestOptions.ReleaseDll)
compilation.AssertTheseDiagnostics(
<expected>
BC30415: 'ReDim' cannot change the number of dimensions of an array.
Redim a(1, 2)
~~~~~~~
</expected>
)
End Sub
<WorkItem(1211526, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1211526"), WorkItem(4924, "https://github.com/dotnet/roslyn/issues/4924")>
<ClrOnlyFact(ClrOnlyReason.Ilasm)>
Public Sub ArraysOfRank1_Literals01()
Dim source =
<compilation>
<file name="a.vb">
class C
Shared Sub Main()
Dim t = new Test()
Dim a = t.Test1()
a = {0, 1}
Print(a)
End Sub
Shared Sub Print(a as System.Array)
for each d in a
System.Console.WriteLine(d)
Next
End Sub
End Class
</file>
</compilation>
Dim compilation = CreateCompilationWithCustomILSource(source, s_arraysOfRank1IlSource, options:=TestOptions.ReleaseExe, includeVbRuntime:=True)
Dim verifier = CompileAndVerify(compilation, expectedOutput:=
<![CDATA[
Test1
0
1
]]>)
verifier.VerifyIL("C.Main",
<![CDATA[
{
// Code size 39 (0x27)
.maxstack 4
IL_0000: newobj "Sub Test..ctor()"
IL_0005: callvirt "Function Test.Test1() As Double(*)"
IL_000a: pop
IL_000b: ldc.i4.2
IL_000c: newobj "Double(*)..ctor"
IL_0011: dup
IL_0012: ldc.i4.1
IL_0013: ldc.r8 1
IL_001c: call "Double(*).Set"
IL_0021: call "Sub C.Print(System.Array)"
IL_0026: ret
}
]]>)
End Sub
<WorkItem(1211526, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1211526"), WorkItem(4924, "https://github.com/dotnet/roslyn/issues/4924")>
<ClrOnlyFact(ClrOnlyReason.Ilasm)>
Public Sub ArraysOfRank1_Literals02()
Dim source =
<compilation>
<file name="a.vb">
class C
Shared Sub Main()
Dim t = new Test()
Dim a = t.Test1()
a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , 11, 12, 13, 14}
Print(a)
End Sub
Shared Sub Print(a as System.Array)
for each d in a
System.Console.WriteLine(d)
Next
End Sub
End Class
</file>
</compilation>
Dim compilation = CreateCompilationWithCustomILSource(source, s_arraysOfRank1IlSource, options:=TestOptions.ReleaseExe, includeVbRuntime:=True)
Dim verifier = CompileAndVerify(compilation, expectedOutput:=
<![CDATA[
Test1
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
]]>)
verifier.VerifyIL("C.Main",
<![CDATA[
{
// Code size 35 (0x23)
.maxstack 3
IL_0000: newobj "Sub Test..ctor()"
IL_0005: callvirt "Function Test.Test1() As Double(*)"
IL_000a: pop
IL_000b: ldc.i4.s 15
IL_000d: newobj "Double(*)..ctor"
IL_0012: dup
IL_0013: ldtoken "<PrivateImplementationDetails>.__StaticArrayInitTypeSize=120 <PrivateImplementationDetails>.834648CEAE9C31873542B1ADBC0668FB21039AD43C50A7D45318910DB18C1DCE"
IL_0018: call "Sub System.Runtime.CompilerServices.RuntimeHelpers.InitializeArray(System.Array, System.RuntimeFieldHandle)"
IL_001d: call "Sub C.Print(System.Array)"
IL_0022: ret
}
]]>)
End Sub
<WorkItem(1211526, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1211526"), WorkItem(4924, "https://github.com/dotnet/roslyn/issues/4924")>
<Fact>
Public Sub ArraysOfRank1_Literals03()
Dim source =
<compilation>
<file name="a.vb">
class C
Shared Sub Main()
Dim t = new Test()
Dim a = t.Test1()
a = ({1})
a = ({1.0})
End Sub
End Class
</file>
</compilation>
Dim compilation = CreateCompilationWithCustomILSource(source, s_arraysOfRank1IlSource, options:=TestOptions.ReleaseDll)
compilation.AssertTheseDiagnostics(
<expected>
BC30311: Value of type 'Integer()' cannot be converted to 'Double(*)'.
a = ({1})
~~~~~
BC30311: Value of type 'Double()' cannot be converted to 'Double(*)'.
a = ({1.0})
~~~~~~~
</expected>
)
End Sub
<WorkItem(1211526, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1211526"), WorkItem(4924, "https://github.com/dotnet/roslyn/issues/4924")>
<ClrOnlyFact(ClrOnlyReason.Ilasm)>
Public Sub ArraysOfRank1_Literals04()
Dim source =
<compilation>
<file name="a.vb">
class C
Shared Sub Main()
Test.M1({1})
End Sub
End Class
</file>
</compilation>
Dim compilation = CreateCompilationWithCustomILSource(source, s_arraysOfRank1IlSource, options:=TestOptions.ReleaseExe)
CompileAndVerify(compilation, expectedOutput:=
<![CDATA[
System.Int32
]]>)
End Sub
<WorkItem(1211526, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1211526"), WorkItem(4924, "https://github.com/dotnet/roslyn/issues/4924")>
<ClrOnlyFact(ClrOnlyReason.Ilasm)>
Public Sub ArraysOfRank1_Literals05()
Dim ilSource As String =
<![CDATA[
.class public auto ansi beforefieldinit Test
extends [mscorlib]System.Object
{
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 1
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method Test1::.ctor
.method public hidebysig static void M1<T>(!!T[0...] a) cil managed
{
.param [1]
.custom instance void [mscorlib]System.ParamArrayAttribute::.ctor() = ( 01 00 00 00 )
// Code size 18 (0x12)
.maxstack 8
IL_0000: nop
IL_0001: ldtoken !!T
IL_0006: call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
IL_000b: call void [mscorlib]System.Console::WriteLine(object)
IL_0010: nop
IL_0011: ret
} // end of method M1
} // end of class Test
]]>.Value
Dim source =
<compilation>
<file name="a.vb">
class C
Shared Sub Main()
Test.M1({1})
End Sub
End Class
</file>
</compilation>
Dim compilation = CreateCompilationWithCustomILSource(source, ilSource, options:=TestOptions.ReleaseExe)
CompileAndVerify(compilation, expectedOutput:=
<![CDATA[
System.Int32
]]>)
End Sub
<WorkItem(1211526, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1211526"), WorkItem(4924, "https://github.com/dotnet/roslyn/issues/4924")>
<Fact>
Public Sub ArraysOfRank1_Literals06()
Dim ilSource As String =
<![CDATA[
.class public auto ansi beforefieldinit Test
extends [mscorlib]System.Object
{
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 1
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method Test1::.ctor
.method public hidebysig static void M1<T>(!!T[0...][] a) cil managed
{
.param [1]
.custom instance void [mscorlib]System.ParamArrayAttribute::.ctor() = ( 01 00 00 00 )
IL_0011: ret
} // end of method M1
.method public hidebysig static void M2<T>(!!T[][0...] a) cil managed
{
.param [1]
.custom instance void [mscorlib]System.ParamArrayAttribute::.ctor() = ( 01 00 00 00 )
IL_0011: ret
} // end of method M1
.method public hidebysig static void M3<T>(!!T[0...][0...] a) cil managed
{
.param [1]
.custom instance void [mscorlib]System.ParamArrayAttribute::.ctor() = ( 01 00 00 00 )
IL_0011: ret
} // end of method M1
} // end of class Test
]]>.Value
Dim source =
<compilation>
<file name="a.vb">
class C
Shared Sub Main()
Test.M1({({1})})
Test.M2({({1})})
Test.M3({({1})})
End Sub
End Class
</file>
</compilation>
Dim compilation = CreateCompilationWithCustomILSource(source, ilSource, options:=TestOptions.ReleaseExe)
compilation.AssertTheseDiagnostics(
<expected>
BC32050: Type parameter 'T' for 'Public Shared Overloads Sub M3(Of T)(ParamArray a As T(*)(*))' cannot be inferred.
Test.M3({({1})})
~~
</expected>
)
End Sub
<WorkItem(1211526, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1211526"), WorkItem(4924, "https://github.com/dotnet/roslyn/issues/4924")>
<ClrOnlyFact(ClrOnlyReason.Ilasm)>
Public Sub ArraysOfRank1_Literals07()
Dim ilSource As String =
<![CDATA[
.class public auto ansi beforefieldinit Test
extends [mscorlib]System.Object
{
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 1
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method Test1::.ctor
.method public hidebysig static void M1<T>(!!T[0...][] a) cil managed
{
.param [1]
.custom instance void [mscorlib]System.ParamArrayAttribute::.ctor() = ( 01 00 00 00 )
.maxstack 8
IL_0000: nop
IL_0001: ldtoken !!T
IL_0006: call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
IL_000b: call void [mscorlib]System.Console::WriteLine(object)
IL_0010: nop
IL_0011: ret
} // end of method M1
.method public hidebysig static void M2<T>(!!T[][0...] a) cil managed
{
.param [1]
.custom instance void [mscorlib]System.ParamArrayAttribute::.ctor() = ( 01 00 00 00 )
.maxstack 8
IL_0000: nop
IL_0001: ldtoken !!T
IL_0006: call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
IL_000b: call void [mscorlib]System.Console::WriteLine(object)
IL_0010: nop
IL_0011: ret
} // end of method M1
} // end of class Test
]]>.Value
Dim source =
<compilation>
<file name="a.vb">
class C
Shared Sub Main()
Test.M1({({-1})})
Test.M2({({-1})})
End Sub
End Class
</file>
</compilation>
Dim compilation = CreateCompilationWithCustomILSource(source, ilSource, options:=TestOptions.ReleaseExe)
CompileAndVerify(compilation, expectedOutput:=
<![CDATA[
System.Int32[]
System.Int32
]]>)
End Sub
<WorkItem(4954, "https://github.com/dotnet/roslyn/issues/4954")>
<ClrOnlyFact(ClrOnlyReason.Ilasm)>
Public Sub SizesAndLowerBounds_01()
Dim ilSource As String =
<![CDATA[
.class public auto ansi beforefieldinit Test
extends [mscorlib]System.Object
{
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 1
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method Test1::.ctor
.method public hidebysig newslot virtual
instance float64[,] Test1() cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test1"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_0007: ldnull
IL_000a: ret
}
.method public hidebysig newslot virtual
instance float64[...,] Test2() cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test2"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_0007: ldnull
IL_000a: ret
}
.method public hidebysig newslot virtual
instance float64[...,...] Test3() cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test3"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_0007: ldnull
IL_000a: ret
}
.method public hidebysig newslot virtual
instance float64[5,] Test4() cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test4"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_0007: ldnull
IL_000a: ret
}
.method public hidebysig newslot virtual
instance float64[5,...] Test5() cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test5"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_0007: ldnull
IL_000a: ret
}
.method public hidebysig newslot virtual
instance float64[5,5] Test6() cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test6"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_0007: ldnull
IL_000a: ret
}
.method public hidebysig newslot virtual
instance float64[5,2...] Test7() cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test7"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_0007: ldnull
IL_000a: ret
}
.method public hidebysig newslot virtual
instance float64[5,2...8] Test8() cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test8"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_0007: ldnull
IL_000a: ret
}
.method public hidebysig newslot virtual
instance float64[1...5,] Test9() cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test9"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_0007: ldnull
IL_000a: ret
}
.method public hidebysig newslot virtual
instance float64[1...5,...] Test10() cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test10"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_0007: ldnull
IL_000a: ret
}
.method public hidebysig newslot virtual
instance float64[1...5,5] Test11() cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test11"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_0007: ldnull
IL_000a: ret
}
.method public hidebysig newslot virtual
instance float64[1...5,2...] Test12() cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test12"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_0007: ldnull
IL_000a: ret
}
.method public hidebysig newslot virtual
instance float64[1...5,2...8] Test13() cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test13"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_0007: ldnull
IL_000a: ret
}
.method public hidebysig newslot virtual
instance float64[1...,] Test14() cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test14"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_0007: ldnull
IL_000a: ret
}
.method public hidebysig newslot virtual
instance float64[1...,...] Test15() cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test15"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_0007: ldnull
IL_000a: ret
}
.method public hidebysig newslot virtual
instance float64[1...,2...] Test16() cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test16"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_0007: ldnull
IL_000a: ret
}
.method public hidebysig newslot virtual
instance float64[1...5] Test17() cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test17"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_0007: ldnull
IL_000a: ret
}
} // end of class Test
]]>.Value
Dim source =
<compilation>
<file name="a.vb">
class C
Inherits Test
Shared Sub Main()
Dim a As double(,)
Dim t = new Test()
a = t.Test1()
a = t.Test2()
a = t.Test3()
a = t.Test4()
a = t.Test5()
a = t.Test6()
a = t.Test7()
a = t.Test8()
a = t.Test9()
a = t.Test10()
a = t.Test11()
a = t.Test12()
a = t.Test13()
a = t.Test14()
a = t.Test15()
a = t.Test16()
t = new C()
a = t.Test1()
a = t.Test2()
a = t.Test3()
a = t.Test4()
a = t.Test5()
a = t.Test6()
a = t.Test7()
a = t.Test8()
a = t.Test9()
a = t.Test10()
a = t.Test11()
a = t.Test12()
a = t.Test13()
a = t.Test14()
a = t.Test15()
a = t.Test16()
End Sub
public overrides Function Test1() As Double(,)
System.Console.WriteLine("Overridden 1")
return Nothing
End Function
public overrides Function Test2() As Double(,)
System.Console.WriteLine("Overridden 2")
return Nothing
End Function
public overrides Function Test3() As Double(,)
System.Console.WriteLine("Overridden 3")
return Nothing
End Function
public overrides Function Test4() As Double(,)
System.Console.WriteLine("Overridden 4")
return Nothing
End Function
public overrides Function Test5() As Double(,)
System.Console.WriteLine("Overridden 5")
return Nothing
End Function
public overrides Function Test6() As Double(,)
System.Console.WriteLine("Overridden 6")
return Nothing
End Function
public overrides Function Test7() As Double(,)
System.Console.WriteLine("Overridden 7")
return Nothing
End Function
public overrides Function Test8() As Double(,)
System.Console.WriteLine("Overridden 8")
return Nothing
End Function
public overrides Function Test9() As Double(,)
System.Console.WriteLine("Overridden 9")
return Nothing
End Function
public overrides Function Test10() As Double(,)
System.Console.WriteLine("Overridden 10")
return Nothing
End Function
public overrides Function Test11() As Double(,)
System.Console.WriteLine("Overridden 11")
return Nothing
End Function
public overrides Function Test12() As Double(,)
System.Console.WriteLine("Overridden 12")
return Nothing
End Function
public overrides Function Test13() As Double(,)
System.Console.WriteLine("Overridden 13")
return Nothing
End Function
public overrides Function Test14() As Double(,)
System.Console.WriteLine("Overridden 14")
return Nothing
End Function
public overrides Function Test15() As Double(,)
System.Console.WriteLine("Overridden 15")
return Nothing
End Function
public overrides Function Test16() As Double(,)
System.Console.WriteLine("Overridden 16")
return Nothing
End Function
End Class
</file>
</compilation>
Dim compilation = CreateCompilationWithCustomILSource(source, ilSource, options:=TestOptions.ReleaseExe)
Dim Test = compilation.GetTypeByMetadataName("Test")
Dim array = DirectCast(Test.GetMember(Of MethodSymbol)("Test1").ReturnType, IArrayTypeSymbol)
Assert.Equal("System.Double(,)", array.ToTestDisplayString())
Assert.False(array.IsSZArray)
Assert.Equal(2, array.Rank)
Assert.True(array.Sizes.IsEmpty)
Assert.True(array.LowerBounds.IsEmpty)
array = DirectCast(Test.GetMember(Of MethodSymbol)("Test2").ReturnType, IArrayTypeSymbol)
Assert.Equal("System.Double(,)", array.ToTestDisplayString())
Assert.False(array.IsSZArray)
Assert.Equal(2, array.Rank)
Assert.True(array.Sizes.IsEmpty)
Assert.True(array.LowerBounds.IsEmpty)
array = DirectCast(Test.GetMember(Of MethodSymbol)("Test3").ReturnType, IArrayTypeSymbol)
Assert.Equal("System.Double(,)", array.ToTestDisplayString())
Assert.False(array.IsSZArray)
Assert.Equal(2, array.Rank)
Assert.True(array.Sizes.IsEmpty)
Assert.True(array.LowerBounds.IsEmpty)
array = DirectCast(Test.GetMember(Of MethodSymbol)("Test4").ReturnType, IArrayTypeSymbol)
Assert.Equal("System.Double(,)", array.ToTestDisplayString())
Assert.False(array.IsSZArray)
Assert.Equal(2, array.Rank)
Assert.Equal({5}, array.Sizes)
Assert.Equal({0}, array.LowerBounds)
array = DirectCast(Test.GetMember(Of MethodSymbol)("Test5").ReturnType, IArrayTypeSymbol)
Assert.Equal("System.Double(,)", array.ToTestDisplayString())
Assert.False(array.IsSZArray)
Assert.Equal(2, array.Rank)
Assert.Equal({5}, array.Sizes)
Assert.Equal({0}, array.LowerBounds)
array = DirectCast(Test.GetMember(Of MethodSymbol)("Test6").ReturnType, IArrayTypeSymbol)
Assert.Equal("System.Double(,)", array.ToTestDisplayString())
Assert.False(array.IsSZArray)
Assert.Equal(2, array.Rank)
Assert.Equal({5, 5}, array.Sizes)
Assert.True(array.LowerBounds.IsDefault)
array = DirectCast(Test.GetMember(Of MethodSymbol)("Test7").ReturnType, IArrayTypeSymbol)
Assert.Equal("System.Double(,)", array.ToTestDisplayString())
Assert.False(array.IsSZArray)
Assert.Equal(2, array.Rank)
Assert.Equal({5}, array.Sizes)
Assert.Equal({0, 2}, array.LowerBounds)
array = DirectCast(Test.GetMember(Of MethodSymbol)("Test8").ReturnType, IArrayTypeSymbol)
Assert.Equal("System.Double(,)", array.ToTestDisplayString())
Assert.False(array.IsSZArray)
Assert.Equal(2, array.Rank)
Assert.Equal({5, 7}, array.Sizes)
Assert.Equal({0, 2}, array.LowerBounds)
array = DirectCast(Test.GetMember(Of MethodSymbol)("Test9").ReturnType, IArrayTypeSymbol)
Assert.Equal("System.Double(,)", array.ToTestDisplayString())
Assert.False(array.IsSZArray)
Assert.Equal(2, array.Rank)
Assert.Equal({5}, array.Sizes)
Assert.Equal({1}, array.LowerBounds)
array = DirectCast(Test.GetMember(Of MethodSymbol)("Test10").ReturnType, IArrayTypeSymbol)
Assert.Equal("System.Double(,)", array.ToTestDisplayString())
Assert.False(array.IsSZArray)
Assert.Equal(2, array.Rank)
Assert.Equal({5}, array.Sizes)
Assert.Equal({1}, array.LowerBounds)
array = DirectCast(Test.GetMember(Of MethodSymbol)("Test11").ReturnType, IArrayTypeSymbol)
Assert.Equal("System.Double(,)", array.ToTestDisplayString())
Assert.False(array.IsSZArray)
Assert.Equal(2, array.Rank)
Assert.Equal({5, 5}, array.Sizes)
Assert.Equal({1, 0}, array.LowerBounds)
array = DirectCast(Test.GetMember(Of MethodSymbol)("Test12").ReturnType, IArrayTypeSymbol)
Assert.Equal("System.Double(,)", array.ToTestDisplayString())
Assert.False(array.IsSZArray)
Assert.Equal(2, array.Rank)
Assert.Equal({5}, array.Sizes)
Assert.Equal({1, 2}, array.LowerBounds)
array = DirectCast(Test.GetMember(Of MethodSymbol)("Test13").ReturnType, IArrayTypeSymbol)
Assert.Equal("System.Double(,)", array.ToTestDisplayString())
Assert.False(array.IsSZArray)
Assert.Equal(2, array.Rank)
Assert.Equal({5, 7}, array.Sizes)
Assert.Equal({1, 2}, array.LowerBounds)
array = DirectCast(Test.GetMember(Of MethodSymbol)("Test14").ReturnType, IArrayTypeSymbol)
Assert.Equal("System.Double(,)", array.ToTestDisplayString())
Assert.False(array.IsSZArray)
Assert.Equal(2, array.Rank)
Assert.True(array.Sizes.IsEmpty)
Assert.Equal({1}, array.LowerBounds)
array = DirectCast(Test.GetMember(Of MethodSymbol)("Test15").ReturnType, IArrayTypeSymbol)
Assert.Equal("System.Double(,)", array.ToTestDisplayString())
Assert.False(array.IsSZArray)
Assert.Equal(2, array.Rank)
Assert.True(array.Sizes.IsEmpty)
Assert.Equal({1}, array.LowerBounds)
array = DirectCast(Test.GetMember(Of MethodSymbol)("Test16").ReturnType, IArrayTypeSymbol)
Assert.Equal("System.Double(,)", array.ToTestDisplayString())
Assert.False(array.IsSZArray)
Assert.Equal(2, array.Rank)
Assert.True(array.Sizes.IsEmpty)
Assert.Equal({1, 2}, array.LowerBounds)
array = DirectCast(Test.GetMember(Of MethodSymbol)("Test17").ReturnType, IArrayTypeSymbol)
Assert.Equal("System.Double(*)", array.ToTestDisplayString())
Assert.False(array.IsSZArray)
Assert.Equal(1, array.Rank)
Assert.Equal({5}, array.Sizes)
Assert.Equal({1}, array.LowerBounds)
Dim verifier = CompileAndVerify(compilation, expectedOutput:=
<![CDATA[Test1
Test2
Test3
Test4
Test5
Test6
Test7
Test8
Test9
Test10
Test11
Test12
Test13
Test14
Test15
Test16
Overridden 1
Overridden 2
Overridden 3
Overridden 4
Overridden 5
Overridden 6
Overridden 7
Overridden 8
Overridden 9
Overridden 10
Overridden 11
Overridden 12
Overridden 13
Overridden 14
Overridden 15
Overridden 16
]]>)
End Sub
<WorkItem(4954, "https://github.com/dotnet/roslyn/issues/4954")>
<ClrOnlyFact(ClrOnlyReason.Ilasm)>
Public Sub SizesAndLowerBounds_02()
Dim ilSource As String =
<![CDATA[
.class public auto ansi beforefieldinit Test
extends [mscorlib]System.Object
{
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 1
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method Test1::.ctor
.method public hidebysig newslot virtual
instance void Test1(float64[,] x) cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test1"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: ret
}
.method public hidebysig newslot virtual
instance void Test2(float64[...,] x) cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test2"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: ret
}
.method public hidebysig newslot virtual
instance void Test3(float64[...,...] x) cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test3"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: ret
}
.method public hidebysig newslot virtual
instance void Test4(float64[5,] x) cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test4"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: ret
}
.method public hidebysig newslot virtual
instance void Test5(float64[5,...] x) cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test5"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: ret
}
.method public hidebysig newslot virtual
instance void Test6(float64[5,5] x) cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test6"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: ret
}
.method public hidebysig newslot virtual
instance void Test7(float64[5,2...] x) cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test7"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: ret
}
.method public hidebysig newslot virtual
instance void Test8(float64[5,2...8] x) cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test8"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: ret
}
.method public hidebysig newslot virtual
instance void Test9(float64[1...5,] x) cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test9"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: ret
}
.method public hidebysig newslot virtual
instance void Test10(float64[1...5,...] x) cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test10"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: ret
}
.method public hidebysig newslot virtual
instance void Test11(float64[1...5,5] x) cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test11"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: ret
}
.method public hidebysig newslot virtual
instance void Test12(float64[1...5,2...] x) cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test12"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: ret
}
.method public hidebysig newslot virtual
instance void Test13(float64[1...5,2...8] x) cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test13"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: ret
}
.method public hidebysig newslot virtual
instance void Test14(float64[1...,] x) cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test14"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: ret
}
.method public hidebysig newslot virtual
instance void Test15(float64[1...,...] x) cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test15"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: ret
}
.method public hidebysig newslot virtual
instance void Test16(float64[1...,2...] x) cil managed
{
// Code size 11 (0xb)
.maxstack 4
IL_0000: ldstr "Test16"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: ret
}
} // end of class Test
]]>.Value
Dim source =
<compilation>
<file name="a.vb">
Class C
Inherits Test
Shared Sub Main()
Dim a As double(,) = New Double(,) {}
Dim t = new Test()
t.Test1(a)
t.Test2(a)
t.Test3(a)
t.Test4(a)
t.Test5(a)
t.Test6(a)
t.Test7(a)
t.Test8(a)
t.Test9(a)
t.Test10(a)
t.Test11(a)
t.Test12(a)
t.Test13(a)
t.Test14(a)
t.Test15(a)
t.Test16(a)
t = new C()
t.Test1(a)
t.Test2(a)
t.Test3(a)
t.Test4(a)
t.Test5(a)
t.Test6(a)
t.Test7(a)
t.Test8(a)
t.Test9(a)
t.Test10(a)
t.Test11(a)
t.Test12(a)
t.Test13(a)
t.Test14(a)
t.Test15(a)
t.Test16(a)
End Sub
public overrides Sub Test1(x As double(,))
System.Console.WriteLine("Overridden 1")
End Sub
public overrides Sub Test2(x As double(,))
System.Console.WriteLine("Overridden 2")
End Sub
public overrides Sub Test3(x As double(,))
System.Console.WriteLine("Overridden 3")
End Sub
public overrides Sub Test4(x As double(,))
System.Console.WriteLine("Overridden 4")
End Sub
public overrides Sub Test5(x As double(,))
System.Console.WriteLine("Overridden 5")
End Sub
public overrides Sub Test6(x As double(,))
System.Console.WriteLine("Overridden 6")
End Sub
public overrides Sub Test7(x As double(,))
System.Console.WriteLine("Overridden 7")
End Sub
public overrides Sub Test8(x As double(,))
System.Console.WriteLine("Overridden 8")
End Sub
public overrides Sub Test9(x As double(,))
System.Console.WriteLine("Overridden 9")
End Sub
public overrides Sub Test10(x As double(,))
System.Console.WriteLine("Overridden 10")
End Sub
public overrides Sub Test11(x As double(,))
System.Console.WriteLine("Overridden 11")
End Sub
public overrides Sub Test12(x As double(,))
System.Console.WriteLine("Overridden 12")
End Sub
public overrides Sub Test13(x As double(,))
System.Console.WriteLine("Overridden 13")
End Sub
public overrides Sub Test14(x As double(,))
System.Console.WriteLine("Overridden 14")
End Sub
public overrides Sub Test15(x As double(,))
System.Console.WriteLine("Overridden 15")
End Sub
public overrides Sub Test16(x As double(,))
System.Console.WriteLine("Overridden 16")
End Sub
End Class
</file>
</compilation>
Dim compilation = CreateCompilationWithCustomILSource(source, ilSource, options:=TestOptions.ReleaseExe)
Dim verifier = CompileAndVerify(compilation, expectedOutput:=
<![CDATA[Test1
Test2
Test3
Test4
Test5
Test6
Test7
Test8
Test9
Test10
Test11
Test12
Test13
Test14
Test15
Test16
Overridden 1
Overridden 2
Overridden 3
Overridden 4
Overridden 5
Overridden 6
Overridden 7
Overridden 8
Overridden 9
Overridden 10
Overridden 11
Overridden 12
Overridden 13
Overridden 14
Overridden 15
Overridden 16
]]>)
End Sub
<ClrOnlyFact(ClrOnlyReason.Ilasm)>
<WorkItem(4958, "https://github.com/dotnet/roslyn/issues/4958")>
Public Sub ArraysOfRank1_InAttributes()
Dim ilSource = "
.class public auto ansi beforefieldinit Program
extends [mscorlib]System.Object
{
.method public hidebysig instance void
Test1() cil managed
{
.custom instance void TestAttribute::.ctor(class [mscorlib] System.Type) = {type(class 'System.Int32[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089')}
// Code size 2 (0x2)
.maxstack 8
IL_0000: nop
IL_0001: ret
} // end of method Program::Test1
.method public hidebysig instance void
Test2() cil managed
{
.custom instance void TestAttribute::.ctor(class [mscorlib] System.Type) = {type(class 'System.Int32[*], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089')}
// Code size 2 (0x2)
.maxstack 8
IL_0000: nop
IL_0001: ret
} // end of method Program::Test2
.method public hidebysig instance void
Test3() cil managed
{
.custom instance void TestAttribute::.ctor(class [mscorlib] System.Type) = {type(class 'System.Int32[*,*], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089')}
// Code size 2 (0x2)
.maxstack 8
IL_0000: nop
IL_0001: ret
} // end of method Program::Test3
.method public hidebysig instance void
Test4() cil managed
{
.custom instance void TestAttribute::.ctor(class [mscorlib] System.Type) = {type(class 'System.Int32[,*], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089')}
// Code size 2 (0x2)
.maxstack 8
IL_0000: nop
IL_0001: ret
} // end of method Program::Test4
} // end of class Program
.class public auto ansi beforefieldinit TestAttribute
extends [mscorlib]System.Attribute
{
.method public hidebysig specialname rtspecialname
instance void .ctor(class [mscorlib]System.Type val) cil managed
{
// Code size 9 (0x9)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Attribute::.ctor()
IL_0006: nop
IL_0007: nop
IL_0008: ret
} // end of method TestAttribute::.ctor
} // end of class TestAttribute
"
Dim source =
<compilation>
<file name="a.vb">
imports System
imports System.Linq
class C
Shared Sub Main()
System.Console.WriteLine(GetTypeFromAttribute("Test1"))
System.Console.WriteLine(GetTypeFromAttribute("Test2"))
Try
GetTypeFromAttribute("Test3")
Catch
System.Console.WriteLine("Throws")
End Try
Try
GetTypeFromAttribute("Test4")
Catch
System.Console.WriteLine("Throws")
End Try
End Sub
Private Shared Function GetTypeFromAttribute(target As String) As Type
Return DirectCast(GetType(Program).GetMember(target)(0).GetCustomAttributesData().ElementAt(0).ConstructorArguments(0).Value, System.Type)
End Function
End Class
</file>
</compilation>
Dim compilation = CreateCompilationWithCustomILSource(source, ilSource, includeVbRuntime:=True,
additionalReferences:={SystemCoreRef}, options:=TestOptions.ReleaseExe)
Dim p = compilation.GetTypeByMetadataName("Program")
Dim a1 = DirectCast(p.GetMember(Of MethodSymbol)("Test1").GetAttributes().Single().ConstructorArguments.Single().Value, ArrayTypeSymbol)
Assert.Equal("System.Int32()", a1.ToTestDisplayString())
Assert.Equal(1, a1.Rank)
Assert.True(a1.IsSZArray)
Dim a2 = DirectCast(p.GetMember(Of MethodSymbol)("Test2").GetAttributes().Single().ConstructorArguments.Single().Value, ArrayTypeSymbol)
Assert.Equal("System.Int32(*)", a2.ToTestDisplayString())
Assert.Equal(1, a2.Rank)
Assert.False(a2.IsSZArray)
Assert.True(DirectCast(p.GetMember(Of MethodSymbol)("Test3").GetAttributes().Single().ConstructorArguments.Single().Value, TypeSymbol).IsErrorType())
Assert.True(DirectCast(p.GetMember(Of MethodSymbol)("Test4").GetAttributes().Single().ConstructorArguments.Single().Value, TypeSymbol).IsErrorType())
CompileAndVerify(compilation, expectedOutput:=
<![CDATA[
System.Int32[]
System.Int32[*]
Throws
Throws]]>)
End Sub
End Class
End Namespace
|