/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/VisualBasic/Test/Semantic/Semantics/Lambda_Relaxation.vb
3 010 строк
116 KB
Tomáš Matoušek
Refactoring of extension methods in source packages (#78620) - take 2 (#78894)
26 июн 2025, 18:42
Не верифицирован
26 июн 2025, 18:42
05fc006
Код
Авторство
О чём код?
' 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 Basic.Reference.Assemblies Imports Microsoft.CodeAnalysis.Test.Utilities Imports Microsoft.CodeAnalysis.VisualBasic Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Imports Roslyn.Test.Utilities Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests.Semantics Public Class Lambda_Relaxation Inherits BasicTestBase <Fact()> Public Sub ArgumentIsVbOrBoxWidening() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Module Program Sub Main() Dim x1 As System.Action(Of Integer) = Sub(x As Object) 'BIND1:"Sub(x As Object)" System.Console.WriteLine(x) End Sub x1(2) End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe) Assert.Equal(OptionStrict.Off, compilation.Options.OptionStrict) Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) If True Then Dim node1 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 1) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node1.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("System.Action(Of System.Int32)", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node1.Parent) Assert.Equal("Widening, Lambda, DelegateRelaxationLevelWidening", conv.Kind.ToString()) Assert.True(conv.Exists) End If Dim verifier = CompileAndVerify(compilation, expectedOutput:="2") CompilationUtils.AssertTheseDiagnostics(compilation, <expected></expected>) verifier.VerifyIL("Program.Main", <![CDATA[ { // Code size 43 (0x2b) .maxstack 2 IL_0000: ldsfld "Program._Closure$__.$IR0-1 As System.Action(Of Integer)" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$IR0-1 As System.Action(Of Integer)" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Sub Program._Closure$__._Lambda$__R0-1(Integer)" IL_0019: newobj "Sub System.Action(Of Integer)..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$IR0-1 As System.Action(Of Integer)" IL_0024: ldc.i4.2 IL_0025: callvirt "Sub System.Action(Of Integer).Invoke(Integer)" IL_002a: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__R0-1", <![CDATA[ { // Code size 48 (0x30) .maxstack 2 IL_0000: ldsfld "Program._Closure$__.$I0-0 As <generated method>" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$I0-0 As <generated method>" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Sub Program._Closure$__._Lambda$__0-0(Object)" IL_0019: newobj "Sub VB$AnonymousDelegate_0(Of Object)..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$I0-0 As <generated method>" IL_0024: ldarg.1 IL_0025: box "Integer" IL_002a: callvirt "Sub VB$AnonymousDelegate_0(Of Object).Invoke(Object)" IL_002f: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__0-0", <![CDATA[ { // Code size 12 (0xc) .maxstack 1 IL_0000: ldarg.1 IL_0001: call "Function System.Runtime.CompilerServices.RuntimeHelpers.GetObjectValue(Object) As Object" IL_0006: call "Sub System.Console.WriteLine(Object)" IL_000b: ret } ]]>) compilation = compilation.WithOptions(TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom)) Assert.Equal(OptionStrict.Custom, compilation.Options.OptionStrict) CompileAndVerify(compilation, expectedOutput:="2") CompilationUtils.AssertTheseDiagnostics(compilation, <expected> </expected>) compilation = compilation.WithOptions(TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.On)) Assert.Equal(OptionStrict.On, compilation.Options.OptionStrict) CompileAndVerify(compilation, expectedOutput:="2") CompilationUtils.AssertTheseDiagnostics(compilation, <expected> </expected>) End Sub <Fact()> Public Sub ArgumentIsVbOrBoxWidening2() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Module Program Sub Main() Dim x1 As System.Action(Of Integer) x1 = CType(Sub(x As Object) 'BIND1:"Sub(x As Object)" System.Console.WriteLine(x) End Sub, System.Action(Of Integer)) x1(2) End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe) For Each optStrict In {OptionStrict.Off, OptionStrict.On, OptionStrict.Custom} compilation = compilation.WithOptions(TestOptions.ReleaseExe.WithOptionStrict(optStrict)) Assert.Equal(optStrict, compilation.Options.OptionStrict) Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) Dim node1 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 1) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node1.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Null(typeInfo.ConvertedType) Dim conv = semanticModel.GetConversion(node1.Parent) Assert.Equal("Identity", conv.Kind.ToString()) Assert.True(conv.Exists) Dim verifier = CompileAndVerify(compilation, expectedOutput:="2") CompilationUtils.AssertTheseDiagnostics(compilation, <expected></expected>) verifier.VerifyIL("Program.Main", <![CDATA[ { // Code size 43 (0x2b) .maxstack 2 IL_0000: ldsfld "Program._Closure$__.$IR0-1 As System.Action(Of Integer)" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$IR0-1 As System.Action(Of Integer)" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Sub Program._Closure$__._Lambda$__R0-1(Integer)" IL_0019: newobj "Sub System.Action(Of Integer)..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$IR0-1 As System.Action(Of Integer)" IL_0024: ldc.i4.2 IL_0025: callvirt "Sub System.Action(Of Integer).Invoke(Integer)" IL_002a: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__R0-1", <![CDATA[ { // Code size 48 (0x30) .maxstack 2 IL_0000: ldsfld "Program._Closure$__.$I0-0 As <generated method>" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$I0-0 As <generated method>" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Sub Program._Closure$__._Lambda$__0-0(Object)" IL_0019: newobj "Sub VB$AnonymousDelegate_0(Of Object)..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$I0-0 As <generated method>" IL_0024: ldarg.1 IL_0025: box "Integer" IL_002a: callvirt "Sub VB$AnonymousDelegate_0(Of Object).Invoke(Object)" IL_002f: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__0-0", <![CDATA[ { // Code size 12 (0xc) .maxstack 1 IL_0000: ldarg.1 IL_0001: call "Function System.Runtime.CompilerServices.RuntimeHelpers.GetObjectValue(Object) As Object" IL_0006: call "Sub System.Console.WriteLine(Object)" IL_000b: ret } ]]>) Next End Sub <Fact()> Public Sub ArgumentIsVbOrBoxWidening3() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Module Program Sub Main() Dim x1 As System.Action(Of Integer) x1 = DirectCast(Sub(x As Object) 'BIND1:"Sub(x As Object)" System.Console.WriteLine(x) End Sub, System.Action(Of Integer)) x1(2) End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe) For Each optStrict In {OptionStrict.Off, OptionStrict.On, OptionStrict.Custom} compilation = compilation.WithOptions(TestOptions.ReleaseExe.WithOptionStrict(optStrict)) Assert.Equal(optStrict, compilation.Options.OptionStrict) Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) Dim node1 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 1) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node1.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Null(typeInfo.ConvertedType) Dim conv = semanticModel.GetConversion(node1.Parent) Assert.Equal("Identity", conv.Kind.ToString()) Assert.True(conv.Exists) Dim verifier = CompileAndVerify(compilation, expectedOutput:="2") CompilationUtils.AssertTheseDiagnostics(compilation, <expected></expected>) verifier.VerifyIL("Program.Main", <![CDATA[ { // Code size 43 (0x2b) .maxstack 2 IL_0000: ldsfld "Program._Closure$__.$IR0-1 As System.Action(Of Integer)" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$IR0-1 As System.Action(Of Integer)" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Sub Program._Closure$__._Lambda$__R0-1(Integer)" IL_0019: newobj "Sub System.Action(Of Integer)..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$IR0-1 As System.Action(Of Integer)" IL_0024: ldc.i4.2 IL_0025: callvirt "Sub System.Action(Of Integer).Invoke(Integer)" IL_002a: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__R0-1", <![CDATA[ { // Code size 48 (0x30) .maxstack 2 IL_0000: ldsfld "Program._Closure$__.$I0-0 As <generated method>" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$I0-0 As <generated method>" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Sub Program._Closure$__._Lambda$__0-0(Object)" IL_0019: newobj "Sub VB$AnonymousDelegate_0(Of Object)..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$I0-0 As <generated method>" IL_0024: ldarg.1 IL_0025: box "Integer" IL_002a: callvirt "Sub VB$AnonymousDelegate_0(Of Object).Invoke(Object)" IL_002f: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__0-0", <![CDATA[ { // Code size 12 (0xc) .maxstack 1 IL_0000: ldarg.1 IL_0001: call "Function System.Runtime.CompilerServices.RuntimeHelpers.GetObjectValue(Object) As Object" IL_0006: call "Sub System.Console.WriteLine(Object)" IL_000b: ret } ]]>) Next End Sub <Fact()> Public Sub ArgumentIsVbOrBoxWidening4() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Module Program Sub Main() Dim x1 As System.Action(Of Integer) x1 = TryCast(Sub(x As Object) 'BIND1:"Sub(x As Object)" System.Console.WriteLine(x) End Sub, System.Action(Of Integer)) x1(2) End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe) For Each optStrict In {OptionStrict.Off, OptionStrict.On, OptionStrict.Custom} compilation = compilation.WithOptions(TestOptions.ReleaseExe.WithOptionStrict(optStrict)) Assert.Equal(optStrict, compilation.Options.OptionStrict) Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) Dim node1 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 1) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node1.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Null(typeInfo.ConvertedType) Dim conv = semanticModel.GetConversion(node1.Parent) Assert.Equal("Identity", conv.Kind.ToString()) Assert.True(conv.Exists) Dim verifier = CompileAndVerify(compilation, expectedOutput:="2") CompilationUtils.AssertTheseDiagnostics(compilation, <expected></expected>) verifier.VerifyIL("Program.Main", <![CDATA[ { // Code size 43 (0x2b) .maxstack 2 IL_0000: ldsfld "Program._Closure$__.$IR0-1 As System.Action(Of Integer)" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$IR0-1 As System.Action(Of Integer)" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Sub Program._Closure$__._Lambda$__R0-1(Integer)" IL_0019: newobj "Sub System.Action(Of Integer)..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$IR0-1 As System.Action(Of Integer)" IL_0024: ldc.i4.2 IL_0025: callvirt "Sub System.Action(Of Integer).Invoke(Integer)" IL_002a: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__R0-1", <![CDATA[ { // Code size 48 (0x30) .maxstack 2 IL_0000: ldsfld "Program._Closure$__.$I0-0 As <generated method>" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$I0-0 As <generated method>" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Sub Program._Closure$__._Lambda$__0-0(Object)" IL_0019: newobj "Sub VB$AnonymousDelegate_0(Of Object)..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$I0-0 As <generated method>" IL_0024: ldarg.1 IL_0025: box "Integer" IL_002a: callvirt "Sub VB$AnonymousDelegate_0(Of Object).Invoke(Object)" IL_002f: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__0-0", <![CDATA[ { // Code size 12 (0xc) .maxstack 1 IL_0000: ldarg.1 IL_0001: call "Function System.Runtime.CompilerServices.RuntimeHelpers.GetObjectValue(Object) As Object" IL_0006: call "Sub System.Console.WriteLine(Object)" IL_000b: ret } ]]>) Next End Sub <Fact()> Public Sub ArgumentIsNarrowing() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Module Program Sub Main() Dim x1 As System.Action(Of Object) = Sub(x As Integer) 'BIND1:"Sub(x As Integer)" System.Console.WriteLine(x) End Sub x1(2) End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe) Assert.Equal(OptionStrict.Off, compilation.Options.OptionStrict) If True Then Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) Dim node1 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 1) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node1.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("System.Action(Of System.Object)", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node1.Parent) Assert.Equal("Narrowing, Lambda, DelegateRelaxationLevelNarrowing", conv.Kind.ToString()) Assert.True(conv.Exists) End If Dim verifier = CompileAndVerify(compilation, expectedOutput:="2") CompilationUtils.AssertTheseDiagnostics(compilation, <expected></expected>) verifier.VerifyIL("Program.Main", <![CDATA[ { // Code size 48 (0x30) .maxstack 2 IL_0000: ldsfld "Program._Closure$__.$IR0-1 As System.Action(Of Object)" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$IR0-1 As System.Action(Of Object)" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Sub Program._Closure$__._Lambda$__R0-1(Object)" IL_0019: newobj "Sub System.Action(Of Object)..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$IR0-1 As System.Action(Of Object)" IL_0024: ldc.i4.2 IL_0025: box "Integer" IL_002a: callvirt "Sub System.Action(Of Object).Invoke(Object)" IL_002f: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__R0-1", <![CDATA[ { // Code size 48 (0x30) .maxstack 2 IL_0000: ldsfld "Program._Closure$__.$I0-0 As <generated method>" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$I0-0 As <generated method>" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Sub Program._Closure$__._Lambda$__0-0(Integer)" IL_0019: newobj "Sub VB$AnonymousDelegate_0(Of Integer)..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$I0-0 As <generated method>" IL_0024: ldarg.1 IL_0025: call "Function Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(Object) As Integer" IL_002a: callvirt "Sub VB$AnonymousDelegate_0(Of Integer).Invoke(Integer)" IL_002f: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__0-0", <![CDATA[ { // Code size 7 (0x7) .maxstack 1 IL_0000: ldarg.1 IL_0001: call "Sub System.Console.WriteLine(Integer)" IL_0006: ret } ]]>) compilation = compilation.WithOptions(TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom)) Assert.Equal(OptionStrict.Custom, compilation.Options.OptionStrict) If True Then Dim tree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) Dim node1 = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 1) Dim typeInfo = semanticModel.GetTypeInfo(DirectCast(node1.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("System.Action(Of System.Object)", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node1.Parent) Assert.Equal("Narrowing, Lambda, DelegateRelaxationLevelNarrowing", conv.Kind.ToString()) Assert.True(conv.Exists) End If CompileAndVerify(compilation, expectedOutput:="2") CompilationUtils.AssertTheseDiagnostics(compilation, <expected> BC42016: Implicit conversion from 'Object' to 'Integer'. Dim x1 As System.Action(Of Object) = Sub(x As Integer) 'BIND1:"Sub(x As Integer)" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) compilation = compilation.WithOptions(TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.On)) Assert.Equal(OptionStrict.On, compilation.Options.OptionStrict) If True Then Dim tree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) Dim node1 = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 1) Dim typeInfo = semanticModel.GetTypeInfo(DirectCast(node1.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("System.Action(Of System.Object)", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node1.Parent) Assert.Equal("Narrowing, Lambda, DelegateRelaxationLevelNarrowing", conv.Kind.ToString()) Assert.True(conv.Exists) End If CompilationUtils.AssertTheseDiagnostics(compilation, <expected> BC30512: Option Strict On disallows implicit conversions from 'Object' to 'Integer'. Dim x1 As System.Action(Of Object) = Sub(x As Integer) 'BIND1:"Sub(x As Integer)" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <WorkItem(543114, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543114")> <Fact()> Public Sub ArgumentIsNarrowing2() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Module Program Sub Main() Dim x1 As System.Action(Of Object) = CType(Sub(x As Integer) System.Console.WriteLine(x) End Sub, System.Action(Of Object)) x1(2) End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe) For Each optStrict In {OptionStrict.Off, OptionStrict.On, OptionStrict.Custom} compilation = compilation.WithOptions(TestOptions.ReleaseExe.WithOptionStrict(optStrict)) Assert.Equal(optStrict, compilation.Options.OptionStrict) Dim verifier = CompileAndVerify(compilation, expectedOutput:="2") CompilationUtils.AssertTheseDiagnostics(compilation, <expected></expected>) verifier.VerifyIL("Program.Main", <![CDATA[ { // Code size 48 (0x30) .maxstack 2 IL_0000: ldsfld "Program._Closure$__.$IR0-1 As System.Action(Of Object)" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$IR0-1 As System.Action(Of Object)" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Sub Program._Closure$__._Lambda$__R0-1(Object)" IL_0019: newobj "Sub System.Action(Of Object)..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$IR0-1 As System.Action(Of Object)" IL_0024: ldc.i4.2 IL_0025: box "Integer" IL_002a: callvirt "Sub System.Action(Of Object).Invoke(Object)" IL_002f: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__R0-1", <![CDATA[ { // Code size 48 (0x30) .maxstack 2 IL_0000: ldsfld "Program._Closure$__.$I0-0 As <generated method>" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$I0-0 As <generated method>" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Sub Program._Closure$__._Lambda$__0-0(Integer)" IL_0019: newobj "Sub VB$AnonymousDelegate_0(Of Integer)..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$I0-0 As <generated method>" IL_0024: ldarg.1 IL_0025: call "Function Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(Object) As Integer" IL_002a: callvirt "Sub VB$AnonymousDelegate_0(Of Integer).Invoke(Integer)" IL_002f: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__0-0", <![CDATA[ { // Code size 7 (0x7) .maxstack 1 IL_0000: ldarg.1 IL_0001: call "Sub System.Console.WriteLine(Integer)" IL_0006: ret } ]]>) Next End Sub <WorkItem(543114, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543114")> <Fact()> Public Sub ArgumentIsNarrowing3() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Module Program Sub Main() Dim x1 As System.Action(Of Object) = DirectCast(Sub(x As Integer) System.Console.WriteLine(x) End Sub, System.Action(Of Object)) x1(2) End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe) For Each optStrict In {OptionStrict.Off, OptionStrict.On, OptionStrict.Custom} compilation = compilation.WithOptions(TestOptions.ReleaseExe.WithOptionStrict(optStrict)) Assert.Equal(optStrict, compilation.Options.OptionStrict) Dim verifier = CompileAndVerify(compilation, expectedOutput:="2") CompilationUtils.AssertTheseDiagnostics(compilation, <expected></expected>) verifier.VerifyIL("Program.Main", <![CDATA[ { // Code size 48 (0x30) .maxstack 2 IL_0000: ldsfld "Program._Closure$__.$IR0-1 As System.Action(Of Object)" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$IR0-1 As System.Action(Of Object)" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Sub Program._Closure$__._Lambda$__R0-1(Object)" IL_0019: newobj "Sub System.Action(Of Object)..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$IR0-1 As System.Action(Of Object)" IL_0024: ldc.i4.2 IL_0025: box "Integer" IL_002a: callvirt "Sub System.Action(Of Object).Invoke(Object)" IL_002f: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__R0-1", <![CDATA[ { // Code size 48 (0x30) .maxstack 2 IL_0000: ldsfld "Program._Closure$__.$I0-0 As <generated method>" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$I0-0 As <generated method>" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Sub Program._Closure$__._Lambda$__0-0(Integer)" IL_0019: newobj "Sub VB$AnonymousDelegate_0(Of Integer)..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$I0-0 As <generated method>" IL_0024: ldarg.1 IL_0025: call "Function Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(Object) As Integer" IL_002a: callvirt "Sub VB$AnonymousDelegate_0(Of Integer).Invoke(Integer)" IL_002f: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__0-0", <![CDATA[ { // Code size 7 (0x7) .maxstack 1 IL_0000: ldarg.1 IL_0001: call "Sub System.Console.WriteLine(Integer)" IL_0006: ret } ]]>) Next End Sub <WorkItem(543114, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543114")> <Fact()> Public Sub ArgumentIsNarrowing4() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Module Program Sub Main() Dim x1 As System.Action(Of Object) = TryCast(Sub(x As Integer) System.Console.WriteLine(x) End Sub, System.Action(Of Object)) x1(2) End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe) For Each optStrict In {OptionStrict.Off, OptionStrict.On, OptionStrict.Custom} compilation = compilation.WithOptions(TestOptions.ReleaseExe.WithOptionStrict(optStrict)) Assert.Equal(optStrict, compilation.Options.OptionStrict) Dim verifier = CompileAndVerify(compilation, expectedOutput:="2") CompilationUtils.AssertTheseDiagnostics(compilation, <expected></expected>) verifier.VerifyIL("Program.Main", <![CDATA[ { // Code size 48 (0x30) .maxstack 2 IL_0000: ldsfld "Program._Closure$__.$IR0-1 As System.Action(Of Object)" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$IR0-1 As System.Action(Of Object)" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Sub Program._Closure$__._Lambda$__R0-1(Object)" IL_0019: newobj "Sub System.Action(Of Object)..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$IR0-1 As System.Action(Of Object)" IL_0024: ldc.i4.2 IL_0025: box "Integer" IL_002a: callvirt "Sub System.Action(Of Object).Invoke(Object)" IL_002f: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__R0-1", <![CDATA[ { // Code size 48 (0x30) .maxstack 2 IL_0000: ldsfld "Program._Closure$__.$I0-0 As <generated method>" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$I0-0 As <generated method>" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Sub Program._Closure$__._Lambda$__0-0(Integer)" IL_0019: newobj "Sub VB$AnonymousDelegate_0(Of Integer)..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$I0-0 As <generated method>" IL_0024: ldarg.1 IL_0025: call "Function Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(Object) As Integer" IL_002a: callvirt "Sub VB$AnonymousDelegate_0(Of Integer).Invoke(Integer)" IL_002f: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__0-0", <![CDATA[ { // Code size 7 (0x7) .maxstack 1 IL_0000: ldarg.1 IL_0001: call "Sub System.Console.WriteLine(Integer)" IL_0006: ret } ]]>) Next End Sub <Fact()> Public Sub ArgumentIsClrWidening() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Imports System Module Program Sub Main() Dim x1 As Action(Of System.Collections.Generic.IEnumerable(Of Integer)) = Sub(x As System.Collections.IEnumerable) 'BIND1:"Sub(x As System.Collections.IEnumerable)" System.Console.WriteLine(x) End Sub x1(New Integer() {}) End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef) For Each optStrict In {OptionStrict.Off, OptionStrict.On, OptionStrict.Custom} compilation = compilation.WithOptions(TestOptions.ReleaseExe.WithOptionStrict(optStrict)) Assert.Equal(optStrict, compilation.Options.OptionStrict) Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) Dim node1 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 1) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node1.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("System.Action(Of System.Collections.Generic.IEnumerable(Of System.Int32))", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node1.Parent) Assert.Equal("Widening, Lambda, DelegateRelaxationLevelWidening", conv.Kind.ToString()) Assert.True(conv.Exists) Dim verifier = CompileAndVerify(compilation, expectedOutput:="System.Int32[]") CompilationUtils.AssertTheseDiagnostics(compilation, <expected></expected>) verifier.VerifyIL("Program.Main", <![CDATA[ { // Code size 48 (0x30) .maxstack 2 IL_0000: ldsfld "Program._Closure$__.$I0-0 As System.Action(Of System.Collections.Generic.IEnumerable(Of Integer))" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$I0-0 As System.Action(Of System.Collections.Generic.IEnumerable(Of Integer))" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Sub Program._Closure$__._Lambda$__0-0(System.Collections.IEnumerable)" IL_0019: newobj "Sub System.Action(Of System.Collections.Generic.IEnumerable(Of Integer))..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$I0-0 As System.Action(Of System.Collections.Generic.IEnumerable(Of Integer))" IL_0024: ldc.i4.0 IL_0025: newarr "Integer" IL_002a: callvirt "Sub System.Action(Of System.Collections.Generic.IEnumerable(Of Integer)).Invoke(System.Collections.Generic.IEnumerable(Of Integer))" IL_002f: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__0-0", <![CDATA[ { // Code size 7 (0x7) .maxstack 1 IL_0000: ldarg.1 IL_0001: call "Sub System.Console.WriteLine(Object)" IL_0006: ret } ]]>) Next End Sub <Fact()> Public Sub ArgumentConversionError() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Imports System Module Program Sub Main() Dim x1 As Action(Of Integer) = Sub(x As System.Guid) 'BIND1:"Sub(x As System.Guid)" End Sub End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef) For Each optStrict In {OptionStrict.Off, OptionStrict.On, OptionStrict.Custom} compilation = compilation.WithOptions(TestOptions.ReleaseExe.WithOptionStrict(optStrict)) Assert.Equal(optStrict, compilation.Options.OptionStrict) Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) Dim node1 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 1) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node1.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("System.Action(Of System.Int32)", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node1.Parent) Assert.Equal("Lambda, DelegateRelaxationLevelInvalid", conv.Kind.ToString()) Assert.False(conv.Exists) CompilationUtils.AssertTheseDiagnostics(compilation, <expected> BC36670: Nested sub does not have a signature that is compatible with delegate 'Action(Of Integer)'. Dim x1 As Action(Of Integer) = Sub(x As System.Guid) 'BIND1:"Sub(x As System.Guid)" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) Next End Sub <Fact()> Public Sub ArgumentConversionError2() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Imports System Module Program Sub Main() Dim x1 As Action(Of Integer) = ((Sub(x As System.Guid) 'BIND1:"Sub(x As System.Guid)" End Sub)) End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef) For Each optStrict In {OptionStrict.Off, OptionStrict.On, OptionStrict.Custom} compilation = compilation.WithOptions(TestOptions.ReleaseExe.WithOptionStrict(optStrict)) Assert.Equal(optStrict, compilation.Options.OptionStrict) Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) Dim node1 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 1) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node1.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("System.Action(Of System.Int32)", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node1.Parent) Assert.Equal("Lambda, DelegateRelaxationLevelInvalid", conv.Kind.ToString()) Assert.False(conv.Exists) CompilationUtils.AssertTheseDiagnostics(compilation, <expected> BC36670: Nested sub does not have a signature that is compatible with delegate 'Action(Of Integer)'. Dim x1 As Action(Of Integer) = ((Sub(x As System.Guid) 'BIND1:"Sub(x As System.Guid)" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) Next End Sub <Fact()> Public Sub ReturnValueIsDropped1() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Imports System Module Program Sub Main() Dim x1 As Action = Function() 1 'BIND1:"Function()" Dim x2 As Action = Function() 'BIND2:"Function()" System.Console.WriteLine("x2") Return 2 End Function x1() x2() End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef) For Each optStrict In {OptionStrict.Off, OptionStrict.On, OptionStrict.Custom} compilation = compilation.WithOptions(TestOptions.ReleaseExe.WithOptionStrict(optStrict)) Assert.Equal(optStrict, compilation.Options.OptionStrict) Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) If True Then Dim node1 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 1) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node1.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("System.Action", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node1.Parent) Assert.Equal("Widening, Lambda, DelegateRelaxationLevelWideningDropReturnOrArgs", conv.Kind.ToString()) Assert.True(conv.Exists) End If If True Then Dim node2 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 2) Dim typeInfo = semanticModel.GetTypeInfo(DirectCast(node2.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("System.Action", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node2.Parent) Assert.Equal("Widening, Lambda, DelegateRelaxationLevelWideningDropReturnOrArgs", conv.Kind.ToString()) Assert.True(conv.Exists) End If Dim verifier = CompileAndVerify(compilation, expectedOutput:="x2") CompilationUtils.AssertTheseDiagnostics(compilation, <expected></expected>) verifier.VerifyIL("Program.Main", <![CDATA[ { // Code size 85 (0x55) .maxstack 2 .locals init (System.Action V_0) //x1 IL_0000: ldsfld "Program._Closure$__.$IR0-1 As System.Action" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$IR0-1 As System.Action" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Sub Program._Closure$__._Lambda$__R0-1()" IL_0019: newobj "Sub System.Action..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$IR0-1 As System.Action" IL_0024: stloc.0 IL_0025: ldsfld "Program._Closure$__.$IR0-2 As System.Action" IL_002a: brfalse.s IL_0033 IL_002c: ldsfld "Program._Closure$__.$IR0-2 As System.Action" IL_0031: br.s IL_0049 IL_0033: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0038: ldftn "Sub Program._Closure$__._Lambda$__R0-2()" IL_003e: newobj "Sub System.Action..ctor(Object, System.IntPtr)" IL_0043: dup IL_0044: stsfld "Program._Closure$__.$IR0-2 As System.Action" IL_0049: ldloc.0 IL_004a: callvirt "Sub System.Action.Invoke()" IL_004f: callvirt "Sub System.Action.Invoke()" IL_0054: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__R0-1", <![CDATA[ { // Code size 43 (0x2b) .maxstack 2 IL_0000: ldsfld "Program._Closure$__.$I0-0 As <generated method>" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$I0-0 As <generated method>" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Function Program._Closure$__._Lambda$__0-0() As Integer" IL_0019: newobj "Sub VB$AnonymousDelegate_0(Of Integer)..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$I0-0 As <generated method>" IL_0024: callvirt "Function VB$AnonymousDelegate_0(Of Integer).Invoke() As Integer" IL_0029: pop IL_002a: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__0-0", <![CDATA[ { // Code size 2 (0x2) .maxstack 1 IL_0000: ldc.i4.1 IL_0001: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__R0-2", <![CDATA[ { // Code size 43 (0x2b) .maxstack 2 IL_0000: ldsfld "Program._Closure$__.$I0-1 As <generated method>" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$I0-1 As <generated method>" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Function Program._Closure$__._Lambda$__0-1() As Integer" IL_0019: newobj "Sub VB$AnonymousDelegate_0(Of Integer)..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$I0-1 As <generated method>" IL_0024: callvirt "Function VB$AnonymousDelegate_0(Of Integer).Invoke() As Integer" IL_0029: pop IL_002a: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__0-1", <![CDATA[ { // Code size 12 (0xc) .maxstack 1 IL_0000: ldstr "x2" IL_0005: call "Sub System.Console.WriteLine(String)" IL_000a: ldc.i4.2 IL_000b: ret } ]]>) Next End Sub <Fact()> Public Sub ReturnValueIsDropped2_ReturnTypeInferenceError() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Imports System Module Program Sub Main() Dim x1 As Action = Function() AddressOf Main 'BIND1:"Function()" Dim x2 As Action = Function() 'BIND2:"Function()" Return AddressOf Main End Function End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef) For Each optStrict In {OptionStrict.Off, OptionStrict.On, OptionStrict.Custom} compilation = compilation.WithOptions(TestOptions.ReleaseExe.WithOptionStrict(optStrict)) Assert.Equal(optStrict, compilation.Options.OptionStrict) Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) If True Then Dim node1 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 1) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node1.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("System.Action", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node1.Parent) Assert.Equal("Lambda, DelegateRelaxationLevelInvalid", conv.Kind.ToString()) Assert.False(conv.Exists) End If If True Then Dim node2 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 2) Dim typeInfo = semanticModel.GetTypeInfo(DirectCast(node2.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("System.Action", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node2.Parent) Assert.Equal("Lambda, DelegateRelaxationLevelInvalid", conv.Kind.ToString()) Assert.False(conv.Exists) End If CompilationUtils.AssertTheseDiagnostics(compilation, <expected> BC30581: 'AddressOf' expression cannot be converted to 'Object' because 'Object' is not a delegate type. Dim x1 As Action = Function() AddressOf Main 'BIND1:"Function()" ~~~~~~~~~~~~~~ BC36751: Cannot infer a return type. Consider adding an 'As' clause to specify the return type. Dim x2 As Action = Function() 'BIND2:"Function()" ~~~~~~~~~~ </expected>) Next End Sub <Fact()> Public Sub SubToFunction() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Imports System Module Program Sub Main() Dim x1 As Func(Of Integer) = Sub() 'BIND1:"Sub()" End Sub End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef) For Each optStrict In {OptionStrict.Off, OptionStrict.On, OptionStrict.Custom} compilation = compilation.WithOptions(TestOptions.ReleaseExe.WithOptionStrict(optStrict)) Assert.Equal(optStrict, compilation.Options.OptionStrict) Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) Dim node1 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 1) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node1.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("System.Func(Of System.Int32)", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node1.Parent) Assert.Equal("Lambda, DelegateRelaxationLevelInvalid", conv.Kind.ToString()) Assert.False(conv.Exists) CompilationUtils.AssertTheseDiagnostics(compilation, <expected> BC36670: Nested sub does not have a signature that is compatible with delegate 'Func(Of Integer)'. Dim x1 As Func(Of Integer) = Sub() 'BIND1:"Sub()" ~~~~~~~~~~~~~~~~~~~~~ </expected>) Next End Sub <Fact()> Public Sub ReturnIsWidening() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Imports System Module Program Sub Main() Dim x1 As Func(Of Integer) = Function() CObj(1) 'BIND1:"Function()" Dim x2 As Func(Of Integer) = Function() As Object 'BIND2:"Function() As Object" Return 2 End Function System.Console.WriteLine(x1()) System.Console.WriteLine(x2()) End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe) Assert.Equal(OptionStrict.Off, compilation.Options.OptionStrict) If True Then Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) If True Then Dim node1 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 1) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node1.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("System.Func(Of System.Int32)", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node1.Parent) Assert.Equal("Widening, Lambda, DelegateRelaxationLevelNarrowing", conv.Kind.ToString()) Assert.True(conv.Exists) End If If True Then Dim node2 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 2) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node2.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("System.Func(Of System.Int32)", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node2.Parent) Assert.Equal("Narrowing, Lambda, DelegateRelaxationLevelNarrowing", conv.Kind.ToString()) Assert.True(conv.Exists) End If End If Dim verifier = CompileAndVerify(compilation, expectedOutput:="1" & Environment.NewLine & "2" & Environment.NewLine) CompilationUtils.AssertTheseDiagnostics(compilation, <expected></expected>) verifier.VerifyIL("Program.Main", <![CDATA[ { // Code size 95 (0x5f) .maxstack 2 .locals init (System.Func(Of Integer) V_0) //x1 IL_0000: ldsfld "Program._Closure$__.$I0-0 As System.Func(Of Integer)" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$I0-0 As System.Func(Of Integer)" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Function Program._Closure$__._Lambda$__0-0() As Integer" IL_0019: newobj "Sub System.Func(Of Integer)..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$I0-0 As System.Func(Of Integer)" IL_0024: stloc.0 IL_0025: ldsfld "Program._Closure$__.$IR0-1 As System.Func(Of Integer)" IL_002a: brfalse.s IL_0033 IL_002c: ldsfld "Program._Closure$__.$IR0-1 As System.Func(Of Integer)" IL_0031: br.s IL_0049 IL_0033: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0038: ldftn "Function Program._Closure$__._Lambda$__R0-1() As Integer" IL_003e: newobj "Sub System.Func(Of Integer)..ctor(Object, System.IntPtr)" IL_0043: dup IL_0044: stsfld "Program._Closure$__.$IR0-1 As System.Func(Of Integer)" IL_0049: ldloc.0 IL_004a: callvirt "Function System.Func(Of Integer).Invoke() As Integer" IL_004f: call "Sub System.Console.WriteLine(Integer)" IL_0054: callvirt "Function System.Func(Of Integer).Invoke() As Integer" IL_0059: call "Sub System.Console.WriteLine(Integer)" IL_005e: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__0-0", <![CDATA[ { // Code size 12 (0xc) .maxstack 1 IL_0000: ldc.i4.1 IL_0001: box "Integer" IL_0006: call "Function Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(Object) As Integer" IL_000b: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__R0-1", <![CDATA[ { // Code size 47 (0x2f) .maxstack 2 IL_0000: ldsfld "Program._Closure$__.$I0-1 As <generated method>" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$I0-1 As <generated method>" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Function Program._Closure$__._Lambda$__0-1() As Object" IL_0019: newobj "Sub VB$AnonymousDelegate_0(Of Object)..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$I0-1 As <generated method>" IL_0024: callvirt "Function VB$AnonymousDelegate_0(Of Object).Invoke() As Object" IL_0029: call "Function Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(Object) As Integer" IL_002e: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__0-1", <![CDATA[ { // Code size 7 (0x7) .maxstack 1 IL_0000: ldc.i4.2 IL_0001: box "Integer" IL_0006: ret } ]]>) compilation = compilation.WithOptions(TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom)) Assert.Equal(OptionStrict.Custom, compilation.Options.OptionStrict) If True Then Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) If True Then Dim node1 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 1) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node1.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("System.Func(Of System.Int32)", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node1.Parent) Assert.Equal("Widening, Lambda, DelegateRelaxationLevelNarrowing", conv.Kind.ToString()) Assert.True(conv.Exists) End If If True Then Dim node2 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 2) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node2.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("System.Func(Of System.Int32)", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node2.Parent) Assert.Equal("Narrowing, Lambda, DelegateRelaxationLevelNarrowing", conv.Kind.ToString()) Assert.True(conv.Exists) End If End If CompileAndVerify(compilation, expectedOutput:="1" & Environment.NewLine & "2" & Environment.NewLine) CompilationUtils.AssertTheseDiagnostics(compilation, <expected> BC42016: Implicit conversion from 'Object' to 'Integer'. Dim x1 As Func(Of Integer) = Function() CObj(1) 'BIND1:"Function()" ~~~~~~~ BC42016: Implicit conversion from 'Object' to 'Integer'. Dim x2 As Func(Of Integer) = Function() As Object 'BIND2:"Function() As Object" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) compilation = compilation.WithOptions(TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.On)) Assert.Equal(OptionStrict.On, compilation.Options.OptionStrict) If True Then Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) If True Then Dim node1 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 1) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node1.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("System.Func(Of System.Int32)", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node1.Parent) Assert.Equal("Lambda, DelegateRelaxationLevelInvalid", conv.Kind.ToString()) Assert.False(conv.Exists) End If If True Then Dim node2 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 2) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node2.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("System.Func(Of System.Int32)", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node2.Parent) Assert.Equal("Narrowing, Lambda, DelegateRelaxationLevelNarrowing", conv.Kind.ToString()) Assert.True(conv.Exists) End If End If CompilationUtils.AssertTheseDiagnostics(compilation, <expected> BC30512: Option Strict On disallows implicit conversions from 'Object' to 'Integer'. Dim x1 As Func(Of Integer) = Function() CObj(1) 'BIND1:"Function()" ~~~~~~~ BC30512: Option Strict On disallows implicit conversions from 'Object' to 'Integer'. Dim x2 As Func(Of Integer) = Function() As Object 'BIND2:"Function() As Object" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub ReturnIsIsVbOrBoxNarrowing1() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Imports System Module Program Sub Main() Dim x1 As Func(Of Object) = Function() As Integer 'BIND1:"Function() As Integer" Return 2 End Function System.Console.WriteLine(x1()) End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef) For Each optStrict In {OptionStrict.Off, OptionStrict.On, OptionStrict.Custom} compilation = compilation.WithOptions(TestOptions.ReleaseExe.WithOptionStrict(optStrict)) Assert.Equal(optStrict, compilation.Options.OptionStrict) Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) If True Then Dim node1 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 1) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node1.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("System.Func(Of System.Object)", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node1.Parent) Assert.Equal("Widening, Lambda, DelegateRelaxationLevelWidening", conv.Kind.ToString()) Assert.True(conv.Exists) End If Dim verifier = CompileAndVerify(compilation, expectedOutput:="2") CompilationUtils.AssertTheseDiagnostics(compilation, <expected></expected>) verifier.VerifyIL("Program.Main", <![CDATA[ { // Code size 52 (0x34) .maxstack 2 IL_0000: ldsfld "Program._Closure$__.$IR0-1 As System.Func(Of Object)" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$IR0-1 As System.Func(Of Object)" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Function Program._Closure$__._Lambda$__R0-1() As Object" IL_0019: newobj "Sub System.Func(Of Object)..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$IR0-1 As System.Func(Of Object)" IL_0024: callvirt "Function System.Func(Of Object).Invoke() As Object" IL_0029: call "Function System.Runtime.CompilerServices.RuntimeHelpers.GetObjectValue(Object) As Object" IL_002e: call "Sub System.Console.WriteLine(Object)" IL_0033: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__R0-1", <![CDATA[ { // Code size 47 (0x2f) .maxstack 2 IL_0000: ldsfld "Program._Closure$__.$I0-0 As <generated method>" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$I0-0 As <generated method>" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Function Program._Closure$__._Lambda$__0-0() As Integer" IL_0019: newobj "Sub VB$AnonymousDelegate_0(Of Integer)..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$I0-0 As <generated method>" IL_0024: callvirt "Function VB$AnonymousDelegate_0(Of Integer).Invoke() As Integer" IL_0029: box "Integer" IL_002e: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__0-0", <![CDATA[ { // Code size 2 (0x2) .maxstack 1 IL_0000: ldc.i4.2 IL_0001: ret } ]]>) Next End Sub <Fact()> Public Sub ReturnIsClrNarrowing() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Imports System Module Program Sub Main() Dim x1 As Func(Of Collections.IEnumerable) = Function() As Collections.Generic.IEnumerable(Of Integer) 'BIND1:"Function() As Collections.Generic.IEnumerable(Of Integer)" Return New Integer() {} End Function System.Console.WriteLine(x1()) End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef) For Each optStrict In {OptionStrict.Off, OptionStrict.On, OptionStrict.Custom} compilation = compilation.WithOptions(TestOptions.ReleaseExe.WithOptionStrict(optStrict)) Assert.Equal(optStrict, compilation.Options.OptionStrict) Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) If True Then Dim node1 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 1) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node1.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("System.Func(Of System.Collections.IEnumerable)", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node1.Parent) Assert.Equal("Widening, Lambda, DelegateRelaxationLevelWidening", conv.Kind.ToString()) Assert.True(conv.Exists) End If Dim verifier = CompileAndVerify(compilation, expectedOutput:="System.Int32[]") CompilationUtils.AssertTheseDiagnostics(compilation, <expected></expected>) verifier.VerifyIL("Program.Main", <![CDATA[ { // Code size 47 (0x2f) .maxstack 2 IL_0000: ldsfld "Program._Closure$__.$I0-0 As System.Func(Of System.Collections.IEnumerable)" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$I0-0 As System.Func(Of System.Collections.IEnumerable)" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Function Program._Closure$__._Lambda$__0-0() As System.Collections.Generic.IEnumerable(Of Integer)" IL_0019: newobj "Sub System.Func(Of System.Collections.IEnumerable)..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$I0-0 As System.Func(Of System.Collections.IEnumerable)" IL_0024: callvirt "Function System.Func(Of System.Collections.IEnumerable).Invoke() As System.Collections.IEnumerable" IL_0029: call "Sub System.Console.WriteLine(Object)" IL_002e: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__0-0", <![CDATA[ { // Code size 7 (0x7) .maxstack 1 IL_0000: ldc.i4.0 IL_0001: newarr "Integer" IL_0006: ret } ]]>) Next End Sub <Fact()> Public Sub ReturnNoConversion() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Imports System Module Program Sub Main() Dim x1 As Func(Of Guid) = Function() As Integer 'BIND1:"Function() As Integer" Return 1 End Function End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef) For Each optStrict In {OptionStrict.Off, OptionStrict.On, OptionStrict.Custom} compilation = compilation.WithOptions(TestOptions.ReleaseExe.WithOptionStrict(optStrict)) Assert.Equal(optStrict, compilation.Options.OptionStrict) Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) If True Then Dim node1 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 1) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node1.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("System.Func(Of System.Guid)", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node1.Parent) Assert.Equal("Lambda, DelegateRelaxationLevelInvalid", conv.Kind.ToString()) Assert.False(conv.Exists) End If CompilationUtils.AssertTheseDiagnostics(compilation, <expected> BC36532: Nested function does not have the same signature as delegate 'Func(Of Guid)'. Dim x1 As Func(Of Guid) = Function() As Integer 'BIND1:"Function() As Integer" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) Next End Sub <Fact()> Public Sub AllArgumentsIgnored() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Imports System Module Program Sub Main() Dim x1 As Func(Of Integer, Integer) = Function() 1 'BIND1:"Function()" Dim x2 As Func(Of Integer, Integer) = Function() As Integer 'BIND2:"Function() As Integer" Return 2 End Function System.Console.WriteLine(x1(12)) System.Console.WriteLine(x2(13)) End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef) For Each optStrict In {OptionStrict.Off, OptionStrict.On, OptionStrict.Custom} compilation = compilation.WithOptions(TestOptions.ReleaseExe.WithOptionStrict(optStrict)) Assert.Equal(optStrict, compilation.Options.OptionStrict) Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) If True Then Dim node1 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 1) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node1.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("System.Func(Of System.Int32, System.Int32)", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node1.Parent) Assert.Equal("Widening, Lambda, DelegateRelaxationLevelWideningDropReturnOrArgs", conv.Kind.ToString()) Assert.True(conv.Exists) End If If True Then Dim node2 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 2) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node2.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("System.Func(Of System.Int32, System.Int32)", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node2.Parent) Assert.Equal("Widening, Lambda, DelegateRelaxationLevelWideningDropReturnOrArgs", conv.Kind.ToString()) Assert.True(conv.Exists) End If Dim verifier = CompileAndVerify(compilation, expectedOutput:="1" & Environment.NewLine & "2" & Environment.NewLine) CompilationUtils.AssertTheseDiagnostics(compilation, <expected></expected>) verifier.VerifyIL("Program.Main", <![CDATA[ { // Code size 99 (0x63) .maxstack 3 .locals init (System.Func(Of Integer, Integer) V_0) //x1 IL_0000: ldsfld "Program._Closure$__.$IR0-1 As System.Func(Of Integer, Integer)" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$IR0-1 As System.Func(Of Integer, Integer)" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Function Program._Closure$__._Lambda$__R0-1(Integer) As Integer" IL_0019: newobj "Sub System.Func(Of Integer, Integer)..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$IR0-1 As System.Func(Of Integer, Integer)" IL_0024: stloc.0 IL_0025: ldsfld "Program._Closure$__.$IR0-2 As System.Func(Of Integer, Integer)" IL_002a: brfalse.s IL_0033 IL_002c: ldsfld "Program._Closure$__.$IR0-2 As System.Func(Of Integer, Integer)" IL_0031: br.s IL_0049 IL_0033: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0038: ldftn "Function Program._Closure$__._Lambda$__R0-2(Integer) As Integer" IL_003e: newobj "Sub System.Func(Of Integer, Integer)..ctor(Object, System.IntPtr)" IL_0043: dup IL_0044: stsfld "Program._Closure$__.$IR0-2 As System.Func(Of Integer, Integer)" IL_0049: ldloc.0 IL_004a: ldc.i4.s 12 IL_004c: callvirt "Function System.Func(Of Integer, Integer).Invoke(Integer) As Integer" IL_0051: call "Sub System.Console.WriteLine(Integer)" IL_0056: ldc.i4.s 13 IL_0058: callvirt "Function System.Func(Of Integer, Integer).Invoke(Integer) As Integer" IL_005d: call "Sub System.Console.WriteLine(Integer)" IL_0062: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__R0-1", <![CDATA[ { // Code size 42 (0x2a) .maxstack 2 IL_0000: ldsfld "Program._Closure$__.$I0-0 As <generated method>" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$I0-0 As <generated method>" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Function Program._Closure$__._Lambda$__0-0() As Integer" IL_0019: newobj "Sub VB$AnonymousDelegate_0(Of Integer)..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$I0-0 As <generated method>" IL_0024: callvirt "Function VB$AnonymousDelegate_0(Of Integer).Invoke() As Integer" IL_0029: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__0-0", <![CDATA[ { // Code size 2 (0x2) .maxstack 1 IL_0000: ldc.i4.1 IL_0001: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__R0-2", <![CDATA[ { // Code size 42 (0x2a) .maxstack 2 IL_0000: ldsfld "Program._Closure$__.$I0-1 As <generated method>" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$I0-1 As <generated method>" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Function Program._Closure$__._Lambda$__0-1() As Integer" IL_0019: newobj "Sub VB$AnonymousDelegate_0(Of Integer)..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$I0-1 As <generated method>" IL_0024: callvirt "Function VB$AnonymousDelegate_0(Of Integer).Invoke() As Integer" IL_0029: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__0-1", <![CDATA[ { // Code size 2 (0x2) .maxstack 1 IL_0000: ldc.i4.2 IL_0001: ret } ]]>) Next End Sub <Fact()> Public Sub ParameterCountMismatch() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Imports System Module Program Sub Main() Dim x1 As Func(Of Integer) = Function(y As Integer) 1 'BIND1:"Function(y As Integer)" Dim x2 As Func(Of Integer) = Function(y As Integer) As Integer 'BIND2:"Function(y As Integer) As Integer" Return 2 End Function Dim x3 As Func(Of Integer, Integer, Integer) = Function(y) 1 'BIND3:"Function(y)" Dim x4 As Func(Of Integer, Integer, Integer) = Function(y) As Integer 'BIND4:"Function(y) As Integer" Return 2 End Function End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef) For Each optStrict In {OptionStrict.Off, OptionStrict.On, OptionStrict.Custom} compilation = compilation.WithOptions(TestOptions.ReleaseExe.WithOptionStrict(optStrict)) Assert.Equal(optStrict, compilation.Options.OptionStrict) Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) If True Then Dim node1 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 1) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node1.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("System.Func(Of System.Int32)", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node1.Parent) Assert.Equal("Lambda, DelegateRelaxationLevelInvalid", conv.Kind.ToString()) Assert.False(conv.Exists) End If If True Then Dim node2 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 2) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node2.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("System.Func(Of System.Int32)", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node2.Parent) Assert.Equal("Lambda, DelegateRelaxationLevelInvalid", conv.Kind.ToString()) Assert.False(conv.Exists) End If If True Then Dim node3 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 3) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node3.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("System.Func(Of System.Int32, System.Int32, System.Int32)", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node3.Parent) Assert.Equal("Lambda, DelegateRelaxationLevelInvalid", conv.Kind.ToString()) Assert.False(conv.Exists) End If If True Then Dim node4 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 4) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node4.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("System.Func(Of System.Int32, System.Int32, System.Int32)", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node4.Parent) Assert.Equal("Lambda, DelegateRelaxationLevelInvalid", conv.Kind.ToString()) Assert.False(conv.Exists) End If CompilationUtils.AssertTheseDiagnostics(compilation, <expected> BC36532: Nested function does not have the same signature as delegate 'Func(Of Integer)'. Dim x1 As Func(Of Integer) = Function(y As Integer) 1 'BIND1:"Function(y As Integer)" ~~~~~~~~~~~~~~~~~~~~~~~~ BC36532: Nested function does not have the same signature as delegate 'Func(Of Integer)'. Dim x2 As Func(Of Integer) = Function(y As Integer) As Integer 'BIND2:"Function(y As Integer) As Integer" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ BC36532: Nested function does not have the same signature as delegate 'Func(Of Integer, Integer, Integer)'. Dim x3 As Func(Of Integer, Integer, Integer) = Function(y) 1 'BIND3:"Function(y)" ~~~~~~~~~~~~~ BC36532: Nested function does not have the same signature as delegate 'Func(Of Integer, Integer, Integer)'. Dim x4 As Func(Of Integer, Integer, Integer) = Function(y) As Integer 'BIND4:"Function(y) As Integer" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) Next End Sub <Fact()> Public Sub ByRefMismatch() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Imports System Module Program Sub Main() Dim x1 As Func(Of Integer, Integer) = Function(ByRef y As Integer) 1 'BIND1:"Function(ByRef y As Integer)" End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef) For Each optStrict In {OptionStrict.Off, OptionStrict.On, OptionStrict.Custom} compilation = compilation.WithOptions(TestOptions.ReleaseExe.WithOptionStrict(optStrict)) Assert.Equal(optStrict, compilation.Options.OptionStrict) Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) If True Then Dim node1 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 1) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node1.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("System.Func(Of System.Int32, System.Int32)", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node1.Parent) Assert.Equal("Lambda, DelegateRelaxationLevelInvalid", conv.Kind.ToString()) Assert.False(conv.Exists) End If CompilationUtils.AssertTheseDiagnostics(compilation, <expected> BC36532: Nested function does not have the same signature as delegate 'Func(Of Integer, Integer)'. Dim x1 As Func(Of Integer, Integer) = Function(ByRef y As Integer) 1 'BIND1:"Function(ByRef y As Integer)" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) Next End Sub <Fact()> Public Sub ByRefArgumentIsWidening() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Imports System Delegate Sub d1(ByRef a As String) Module Program Sub Main() Dim x1 As d1 = Sub(ByRef y As Object) 'BIND1:"Sub(ByRef y As Object)" System.Console.WriteLine(y) y = "2" End Sub Dim x2 As String = "1" x1(x2) System.Console.WriteLine(x2) End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe) Assert.Equal(OptionStrict.Off, compilation.Options.OptionStrict) If True Then Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) Dim node1 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 1) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node1.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("d1", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node1.Parent) Assert.Equal("Narrowing, Lambda, DelegateRelaxationLevelNarrowing", conv.Kind.ToString()) Assert.True(conv.Exists) End If Dim verifier = CompileAndVerify(compilation, expectedOutput:="1" & Environment.NewLine & "2" & Environment.NewLine) CompilationUtils.AssertTheseDiagnostics(compilation, <expected></expected>) verifier.VerifyIL("Program.Main", <![CDATA[ { // Code size 56 (0x38) .maxstack 2 .locals init (String V_0) //x2 IL_0000: ldsfld "Program._Closure$__.$IR0-1 As d1" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$IR0-1 As d1" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Sub Program._Closure$__._Lambda$__R0-1(ByRef String)" IL_0019: newobj "Sub d1..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$IR0-1 As d1" IL_0024: ldstr "1" IL_0029: stloc.0 IL_002a: ldloca.s V_0 IL_002c: callvirt "Sub d1.Invoke(ByRef String)" IL_0031: ldloc.0 IL_0032: call "Sub System.Console.WriteLine(String)" IL_0037: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__R0-1", <![CDATA[ { // Code size 55 (0x37) .maxstack 2 .locals init (Object V_0) IL_0000: ldsfld "Program._Closure$__.$I0-0 As <generated method>" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$I0-0 As <generated method>" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Sub Program._Closure$__._Lambda$__0-0(ByRef Object)" IL_0019: newobj "Sub VB$AnonymousDelegate_0(Of Object)..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$I0-0 As <generated method>" IL_0024: ldarg.1 IL_0025: ldind.ref IL_0026: stloc.0 IL_0027: ldloca.s V_0 IL_0029: callvirt "Sub VB$AnonymousDelegate_0(Of Object).Invoke(ByRef Object)" IL_002e: ldarg.1 IL_002f: ldloc.0 IL_0030: call "Function Microsoft.VisualBasic.CompilerServices.Conversions.ToString(Object) As String" IL_0035: stind.ref IL_0036: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__0-0", <![CDATA[ { // Code size 20 (0x14) .maxstack 2 IL_0000: ldarg.1 IL_0001: ldind.ref IL_0002: call "Function System.Runtime.CompilerServices.RuntimeHelpers.GetObjectValue(Object) As Object" IL_0007: call "Sub System.Console.WriteLine(Object)" IL_000c: ldarg.1 IL_000d: ldstr "2" IL_0012: stind.ref IL_0013: ret } ]]>) compilation = compilation.WithOptions(TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom)) Assert.Equal(OptionStrict.Custom, compilation.Options.OptionStrict) If True Then Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) Dim node1 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 1) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node1.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("d1", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node1.Parent) Assert.Equal("Narrowing, Lambda, DelegateRelaxationLevelNarrowing", conv.Kind.ToString()) Assert.True(conv.Exists) End If CompileAndVerify(compilation, expectedOutput:="1" & Environment.NewLine & "2" & Environment.NewLine) CompilationUtils.AssertTheseDiagnostics(compilation, <expected> BC41999: Implicit conversion from 'Object' to 'String' in copying the value of 'ByRef' parameter 'y' back to the matching argument. Dim x1 As d1 = Sub(ByRef y As Object) 'BIND1:"Sub(ByRef y As Object)" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) compilation = compilation.WithOptions(TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.On)) Assert.Equal(OptionStrict.On, compilation.Options.OptionStrict) If True Then Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) Dim node1 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 1) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node1.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("d1", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node1.Parent) Assert.Equal("Narrowing, Lambda, DelegateRelaxationLevelNarrowing", conv.Kind.ToString()) Assert.True(conv.Exists) End If CompilationUtils.AssertTheseDiagnostics(compilation, <expected> BC32029: Option Strict On disallows narrowing from type 'Object' to type 'String' in copying the value of 'ByRef' parameter 'y' back to the matching argument. Dim x1 As d1 = Sub(ByRef y As Object) 'BIND1:"Sub(ByRef y As Object)" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub NoRelaxation() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Imports System Delegate Sub d1(ByRef a As Object) Module Program Sub Main() Dim x1 As d1 = Sub(ByRef y As Object) 'BIND1:"Sub(ByRef y As Object)" System.Console.WriteLine(y) y = "2" End Sub Dim x2 As Object = "1" x1(x2) System.Console.WriteLine(x2) End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef) For Each optStrict In {OptionStrict.Off, OptionStrict.On, OptionStrict.Custom} compilation = compilation.WithOptions(TestOptions.ReleaseExe.WithOptionStrict(optStrict)) Assert.Equal(optStrict, compilation.Options.OptionStrict) Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) If True Then Dim node1 As LambdaHeaderSyntax = CompilationUtils.FindBindingText(Of LambdaHeaderSyntax)(compilation, "a.vb", 1) Dim typeInfo As TypeInfo = semanticModel.GetTypeInfo(DirectCast(node1.Parent, LambdaExpressionSyntax)) Assert.Null(typeInfo.Type) Assert.Equal("d1", typeInfo.ConvertedType.ToTestDisplayString()) Dim conv = semanticModel.GetConversion(node1.Parent) Assert.Equal("Widening, Lambda", conv.Kind.ToString()) Assert.True(conv.Exists) End If Dim verifier = CompileAndVerify(compilation, expectedOutput:="1" & Environment.NewLine & "2" & Environment.NewLine) CompilationUtils.AssertTheseDiagnostics(compilation, <expected></expected>) verifier.VerifyIL("Program.Main", <![CDATA[ { // Code size 61 (0x3d) .maxstack 2 .locals init (Object V_0) //x2 IL_0000: ldsfld "Program._Closure$__.$I0-0 As d1" IL_0005: brfalse.s IL_000e IL_0007: ldsfld "Program._Closure$__.$I0-0 As d1" IL_000c: br.s IL_0024 IL_000e: ldsfld "Program._Closure$__.$I As Program._Closure$__" IL_0013: ldftn "Sub Program._Closure$__._Lambda$__0-0(ByRef Object)" IL_0019: newobj "Sub d1..ctor(Object, System.IntPtr)" IL_001e: dup IL_001f: stsfld "Program._Closure$__.$I0-0 As d1" IL_0024: ldstr "1" IL_0029: stloc.0 IL_002a: ldloca.s V_0 IL_002c: callvirt "Sub d1.Invoke(ByRef Object)" IL_0031: ldloc.0 IL_0032: call "Function System.Runtime.CompilerServices.RuntimeHelpers.GetObjectValue(Object) As Object" IL_0037: call "Sub System.Console.WriteLine(Object)" IL_003c: ret } ]]>) verifier.VerifyIL("Program._Closure$__._Lambda$__0-0", <![CDATA[ { // Code size 20 (0x14) .maxstack 2 IL_0000: ldarg.1 IL_0001: ldind.ref IL_0002: call "Function System.Runtime.CompilerServices.RuntimeHelpers.GetObjectValue(Object) As Object" IL_0007: call "Sub System.Console.WriteLine(Object)" IL_000c: ldarg.1 IL_000d: ldstr "2" IL_0012: stind.ref IL_0013: ret } ]]>) Next End Sub <Fact()> Public Sub RestrictedTypes1() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Imports System Delegate Sub d5(a1 As Object, a2 As ArgIterator) Class Program Sub Main() Dim x1 As d5 = Sub(y1 As Object, y2 As ArgIterator) End Sub Dim x2 As d5 = Sub(y1 As String, y2 As ArgIterator) End Sub End Sub Sub Test123(y2 As ArgIterator) Dim x1 As Action(Of Object) = Function(y1 As Object) As ArgIterator Return y2 '1 End Function '1 Dim x2 As Action(Of Object) = Function(y1 As Object) As ArgIterator End Function '2 Dim x3 As Action(Of Object) = Function(y1 As Object) Return y2 '3 End Function '3 Dim x4 As d6 = Function() Nothing End Sub End Class </file> </compilation> Dim compilation = CreateCompilationWithCustomILSource(compilationDef, <![CDATA[ .class public auto ansi sealed d6 extends [mscorlib]System.MulticastDelegate { .method public specialname rtspecialname instance void .ctor(object TargetObject, native int TargetMethod) runtime managed { } // end of method d6::.ctor .method public newslot strict virtual instance class [mscorlib]System.IAsyncResult BeginInvoke(int32 x, class [mscorlib]System.AsyncCallback DelegateCallback, object DelegateAsyncState) runtime managed { } // end of method d6::BeginInvoke .method public newslot strict virtual instance valuetype [mscorlib]System.ArgIterator EndInvoke(class [mscorlib]System.IAsyncResult DelegateAsyncResult) runtime managed { } // end of method d6::EndInvoke .method public newslot strict virtual instance valuetype [mscorlib]System.ArgIterator Invoke(int32 x) runtime managed { } // end of method d6::Invoke } // end of class d6 ]]>) 'Dim compilation = CompilationUtils.CreateCompilationWithMscorlibAndVBRuntime(compilationDef, OptionsExe) CompilationUtils.AssertTheseDiagnostics(compilation, <expected> <![CDATA[ BC31396: 'ArgIterator' cannot be made nullable, and cannot be used as the data type of an array element, field, anonymous type member, type argument, 'ByRef' parameter, or return statement. Dim x2 As d5 = Sub(y1 As String, y2 As ArgIterator) ~~~~~~~~~~~ BC31396: 'ArgIterator' cannot be made nullable, and cannot be used as the data type of an array element, field, anonymous type member, type argument, 'ByRef' parameter, or return statement. Dim x1 As Action(Of Object) = Function(y1 As Object) As ArgIterator ~~~~~~~~~~~ BC31396: 'ArgIterator' cannot be made nullable, and cannot be used as the data type of an array element, field, anonymous type member, type argument, 'ByRef' parameter, or return statement. Dim x2 As Action(Of Object) = Function(y1 As Object) As ArgIterator ~~~~~~~~~~~ BC42105: Function '<anonymous method>' doesn't return a value on all code paths. A null reference exception could occur at run time when the result is used. End Function '2 ~~~~~~~~~~~~ BC31396: 'ArgIterator' cannot be made nullable, and cannot be used as the data type of an array element, field, anonymous type member, type argument, 'ByRef' parameter, or return statement. Dim x3 As Action(Of Object) = Function(y1 As Object) ~~~~~~~~~~~~~~~~~~~~~~ BC31396: 'ArgIterator' cannot be made nullable, and cannot be used as the data type of an array element, field, anonymous type member, type argument, 'ByRef' parameter, or return statement. Dim x4 As d6 = Function() Nothing ~~~~~~~~~~ ]]> </expected>) End Sub <Fact()> Public Sub OverloadResolution1() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Imports System Module Program Sub Test1(x As Func(Of Func(Of Object, Integer))) System.Console.WriteLine(x) End Sub Sub Test1(x As Func(Of Func(Of Integer, Integer))) System.Console.WriteLine(x) End Sub Function Test2(a As Object) As Integer Return 1 End Function Sub Main() 10: Test1(Function() Function(a As Object) 1) 20: Test1(Function() Return Function(a As Object) 1 End Function) 30: Test1(Function() Return Function(a As Object) Return 1 End Function End Function) 40: Test1(Function() Return Function(a As Object) As Integer Return 1 End Function End Function) 50: Test1(Function() As Func(Of Object, Integer) Return Function(a As Object) Return 1 End Function End Function) Test1(Function() AddressOf Test2) End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe) CompilationUtils.AssertTheseDiagnostics(compilation, <expected> BC30521: Overload resolution failed because no accessible 'Test1' is most specific for these arguments: 'Public Sub Test1(x As Func(Of Func(Of Object, Integer)))': Not most specific. 'Public Sub Test1(x As Func(Of Func(Of Integer, Integer)))': Not most specific. 10: Test1(Function() Function(a As Object) 1) ~~~~~ BC30521: Overload resolution failed because no accessible 'Test1' is most specific for these arguments: 'Public Sub Test1(x As Func(Of Func(Of Object, Integer)))': Not most specific. 'Public Sub Test1(x As Func(Of Func(Of Integer, Integer)))': Not most specific. 20: Test1(Function() ~~~~~ BC30521: Overload resolution failed because no accessible 'Test1' is most specific for these arguments: 'Public Sub Test1(x As Func(Of Func(Of Object, Integer)))': Not most specific. 'Public Sub Test1(x As Func(Of Func(Of Integer, Integer)))': Not most specific. 30: Test1(Function() ~~~~~ BC30521: Overload resolution failed because no accessible 'Test1' is most specific for these arguments: 'Public Sub Test1(x As Func(Of Func(Of Object, Integer)))': Not most specific. 'Public Sub Test1(x As Func(Of Func(Of Integer, Integer)))': Not most specific. 40: Test1(Function() ~~~~~ BC30521: Overload resolution failed because no accessible 'Test1' is most specific for these arguments: 'Public Sub Test1(x As Func(Of Func(Of Object, Integer)))': Not most specific. 'Public Sub Test1(x As Func(Of Func(Of Integer, Integer)))': Not most specific. Test1(Function() AddressOf Test2) ~~~~~ </expected>) End Sub <Fact()> Public Sub OverloadResolution2() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Imports System Module Program Sub Test1(x As Func(Of Object, Integer)) System.Console.WriteLine(x) End Sub Sub Test1(x As Func(Of Integer, Integer)) System.Console.WriteLine(x) End Sub Sub Main() Test1(Function(x As Object) 1) Test1(Function(x As Integer) 1) End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe) CompileAndVerify(compilation, <![CDATA[ System.Func`2[System.Object,System.Int32] System.Func`2[System.Int32,System.Int32] ]]>) CompilationUtils.AssertTheseDiagnostics(compilation, <expected> </expected>) End Sub <Fact()> Public Sub OverloadResolution3() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Imports System Module Program Sub Test2(x As Func(Of Object, Integer)) System.Console.WriteLine(x) End Sub Sub Test2(x As Func(Of Integer, Integer)) System.Console.WriteLine(x) End Sub Sub Main() Test2(Function(x As String) 1) End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe) CompilationUtils.AssertTheseDiagnostics(compilation, <expected> BC30519: Overload resolution failed because no accessible 'Test2' can be called without a narrowing conversion: 'Public Sub Test2(x As Func(Of Object, Integer))': Argument matching parameter 'x' narrows to 'Func(Of Object, Integer)'. 'Public Sub Test2(x As Func(Of Integer, Integer))': Argument matching parameter 'x' narrows to 'Func(Of Integer, Integer)'. Test2(Function(x As String) 1) ~~~~~ </expected>) compilation = compilation.WithOptions(TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.On)) CompilationUtils.AssertTheseDiagnostics(compilation, <expected> BC30518: Overload resolution failed because no accessible 'Test2' can be called with these arguments: 'Public Sub Test2(x As Func(Of Object, Integer))': Option Strict On disallows implicit conversions from 'Object' to 'String'. 'Public Sub Test2(x As Func(Of Integer, Integer))': Option Strict On disallows implicit conversions from 'Integer' to 'String'. Test2(Function(x As String) 1) ~~~~~ </expected>) End Sub <Fact()> Public Sub OverloadResolution4() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Imports System Module Program Sub Test3(x As Func(Of Object)) System.Console.WriteLine(x) End Sub Sub Test4(x As Func(Of Object)) System.Console.WriteLine(x) End Sub Sub Test3(x As Func(Of Integer)) System.Console.WriteLine(x) End Sub Sub Test5(x As Func(Of Integer)) System.Console.WriteLine(x) End Sub Sub Main() Test3(Function() "a") Test4(Function() "a") Test5(Function() "a") Test3(Function() Return "b" End Function) Test4(Function() Return "b" End Function) Test5(Function() Return "b" End Function) Test3(Function() As String Return "b" End Function) Test4(Function() As String Return "b" End Function) Test5(Function() As String Return "b" End Function) End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom)) CompilationUtils.AssertTheseDiagnostics(compilation, <expected> BC42016: Implicit conversion from 'String' to 'Integer'. Test5(Function() "a") ~~~ BC42016: Implicit conversion from 'String' to 'Integer'. Return "b" ~~~ BC42016: Implicit conversion from 'String' to 'Integer'. Test5(Function() As String ~~~~~~~~~~~~~~~~~~~~~ </expected>) CompileAndVerify(compilation, <![CDATA[ System.Func`1[System.Object] System.Func`1[System.Object] System.Func`1[System.Int32] System.Func`1[System.Object] System.Func`1[System.Object] System.Func`1[System.Int32] System.Func`1[System.Object] System.Func`1[System.Object] System.Func`1[System.Int32] ]]>) End Sub <Fact()> Public Sub OverloadResolution5() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Option Strict On Imports System Module Program Sub Test6(x As Object) System.Console.WriteLine(x) End Sub Sub Test7(x As Object) System.Console.WriteLine(x) End Sub Sub Test6(x As Func(Of Object)) System.Console.WriteLine(x) End Sub Sub Test8(x As Func(Of Object)) System.Console.WriteLine(x) End Sub Sub Test9(x As Func(Of String)) System.Console.WriteLine(x) End Sub Sub Test10(x As Func(Of String)) System.Console.WriteLine(x) End Sub Sub Test9(x As Func(Of Object)) System.Console.WriteLine(x) End Sub Sub Test11(x As Func(Of String)) System.Console.WriteLine(x) End Sub Sub Main() Test6(Function() "a") Test7(Function() "a") Test8(Function() "a") Test6(Function() Return "b" End Function) Test7(Function() Return "b" End Function) Test8(Function() Return "b" End Function) Test6(Function() As String Return "b" End Function) Test7(Function() As String Return "b" End Function) Test8(Function() As String Return "b" End Function) Test9(Function() "a") Test10(Function() "a") Test11(Function() "a") Test9(Function() Return "b" End Function) Test10(Function() Return "b" End Function) Test11(Function() Return "b" End Function) Test9(Function() As String Return "c" End Function) Test10(Function() As String Return "c" End Function) Test11(Function() As String Return "c" End Function) End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe.WithOptionStrict(OptionStrict.Custom)) CompilationUtils.AssertTheseDiagnostics(compilation, <expected> </expected>) CompileAndVerify(compilation, <![CDATA[ System.Func`1[System.Object] VB$AnonymousDelegate_0`1[System.String] System.Func`1[System.Object] System.Func`1[System.Object] VB$AnonymousDelegate_0`1[System.String] System.Func`1[System.Object] System.Func`1[System.Object] VB$AnonymousDelegate_0`1[System.String] System.Func`1[System.Object] System.Func`1[System.String] System.Func`1[System.String] System.Func`1[System.String] System.Func`1[System.String] System.Func`1[System.String] System.Func`1[System.String] System.Func`1[System.String] System.Func`1[System.String] System.Func`1[System.String] ]]>) End Sub <Fact()> Public Sub ArgumentIsVbOrBoxWidening5() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Module Program Sub Main() Dim val As Integer = 1 Dim x1 As System.Action(Of Integer) = Sub(x As Object) System.Console.WriteLine("{0}{1}",val,x) End Sub x1(2) End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe) Assert.Equal(OptionStrict.Off, compilation.Options.OptionStrict) Dim verifier = CompileAndVerify(compilation, expectedOutput:="12") CompilationUtils.AssertTheseDiagnostics(compilation, <expected></expected>) verifier.VerifyIL("Program.Main", <![CDATA[ { // Code size 30 (0x1e) .maxstack 3 IL_0000: newobj "Sub Program._Closure$__0-0..ctor()" IL_0005: dup IL_0006: ldc.i4.1 IL_0007: stfld "Program._Closure$__0-0.$VB$Local_val As Integer" IL_000c: ldftn "Sub Program._Closure$__0-0._Lambda$__R1(Integer)" IL_0012: newobj "Sub System.Action(Of Integer)..ctor(Object, System.IntPtr)" IL_0017: ldc.i4.2 IL_0018: callvirt "Sub System.Action(Of Integer).Invoke(Integer)" IL_001d: ret } ]]>) verifier.VerifyIL("Program._Closure$__0-0._Lambda$__R1", <![CDATA[ { // Code size 13 (0xd) .maxstack 2 IL_0000: ldarg.0 IL_0001: ldarg.1 IL_0002: box "Integer" IL_0007: call "Sub Program._Closure$__0-0._Lambda$__0(Object)" IL_000c: ret } ]]>) verifier.VerifyIL("Program._Closure$__0-0._Lambda$__0", <![CDATA[ { // Code size 28 (0x1c) .maxstack 3 IL_0000: ldstr "{0}{1}" IL_0005: ldarg.0 IL_0006: ldfld "Program._Closure$__0-0.$VB$Local_val As Integer" IL_000b: box "Integer" IL_0010: ldarg.1 IL_0011: call "Function System.Runtime.CompilerServices.RuntimeHelpers.GetObjectValue(Object) As Object" IL_0016: call "Sub System.Console.WriteLine(String, Object, Object)" IL_001b: ret } ]]>) End Sub <Fact()> Public Sub CustomModifiers1() Dim compilationDef = <compilation name="LambdaTests1"> <file name="a.vb"> Imports System Class Program Shared Sub Main() Dim d As TestCustomModifiers Dim a(-1) As Integer d = AddressOf F1 d(a) d = Function(x) System.Console.WriteLine("L1") Return x End Function d(a) d = Function(x As Integer()) As Integer() System.Console.WriteLine("L2") Return x End Function d(a) End Sub Shared Function F1(x As Integer()) As Integer() System.Console.WriteLine("F1") Return x End Function End Class </file> </compilation> Dim compilation = CreateCompilationWithCustomILSource(compilationDef, <![CDATA[ .class public auto ansi sealed TestCustomModifiers extends [mscorlib]System.MulticastDelegate { .method public specialname rtspecialname instance void .ctor(object TargetObject, native int TargetMethod) runtime managed { } // end of method TestCustomModifiers::.ctor .method public newslot strict virtual instance class [mscorlib]System.IAsyncResult BeginInvoke(int32 modopt([mscorlib]System.Runtime.CompilerServices.IsConst) [] modopt([mscorlib]System.Runtime.CompilerServices.IsConst) x, class [mscorlib]System.AsyncCallback DelegateCallback, object DelegateAsyncState) runtime managed { } // end of method TestCustomModifiers::BeginInvoke .method public newslot strict virtual instance int32 modopt([mscorlib]System.Runtime.CompilerServices.IsConst) [] modopt([mscorlib]System.Runtime.CompilerServices.IsConst) EndInvoke(class [mscorlib]System.IAsyncResult DelegateAsyncResult) runtime managed { } // end of method TestCustomModifiers::EndInvoke .method public newslot strict virtual instance int32 modopt([mscorlib]System.Runtime.CompilerServices.IsConst) [] modopt([mscorlib]System.Runtime.CompilerServices.IsConst) Invoke(int32 modopt([mscorlib]System.Runtime.CompilerServices.IsConst) [] modopt([mscorlib]System.Runtime.CompilerServices.IsConst) x) runtime managed { } // end of method TestCustomModifiers::Invoke } // end of class TestCustomModifiers ]]>.Value, TestOptions.ReleaseExe) CompilationUtils.AssertTheseDiagnostics(compilation, <expected> </expected>) CompileAndVerify(compilation, expectedOutput:="F1" & Environment.NewLine & "L1" & Environment.NewLine & "L2") End Sub <WorkItem(543647, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543647")> <Fact()> Public Sub BaseMethodParamIntegerDelegateParamShort() Dim compilationDef = <compilation name="Test"> <file name="a.vb"> Imports System Delegate Function DelShort(ByVal s As Short) As String MustInherit Class BaseClass Overridable Function MethodThatIsVirtual(ByVal i As Integer) As String Return "Base Method" End Function End Class Class DerivedClass Inherits BaseClass Overrides Function MethodThatIsVirtual(ByVal i As Integer) As String Return "Derived Method" End Function Function TC2() As String Dim dS As DelShort = AddressOf MyBase.MethodThatIsVirtual Return dS(1) End Function End Class Module Program Sub Main(args As String()) Dim d = New DerivedClass() Console.WriteLine(d.TC2()) End Sub End Module </file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe) CompilationUtils.AssertTheseDiagnostics(compilation, <expected></expected>) Dim verifier = CompileAndVerify(compilation, expectedOutput:="Base Method") End Sub <WorkItem(531532, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/531532")> <Fact()> Public Sub Bug18258() Dim compilationDef = <compilation> <file name="a.vb"><![CDATA[ Imports System Imports System.Runtime.CompilerServices Friend Module Program <Extension> Sub Bar(Of T)(x As T) Dim d As New Action(Of Action(Of T))(Sub(y) End Sub) d.Invoke(AddressOf x.Bar) End Sub Sub Main() End Sub End Module ]]></file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntimeAndReferences(compilationDef, {Net40.References.SystemCore}, TestOptions.ReleaseDll) CompilationUtils.AssertTheseDiagnostics(compilation, <expected></expected>) Dim verifier = CompileAndVerify(compilation) End Sub <WorkItem(1096576, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1096576")> <Fact()> Public Sub Bug1096576() Dim compilationDef = <compilation> <file name="a.vb"><![CDATA[ Imports System Class Thing Sub Goo() End Sub Public t As New Thing Public tcb As AsyncCallback = AddressOf t.Goo End Class ]]></file> </compilation> Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40(compilationDef, options:=TestOptions.DebugDll) Dim verifier = CompileAndVerify(compilation).VerifyDiagnostics() End Sub End Class End Namespace