/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/VisualBasic/Test/Semantic/Semantics/AsyncAwait.vb
5 717 строк
177 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 System.Collections.ObjectModel Imports Basic.Reference.Assemblies Imports Microsoft.CodeAnalysis.Test.Utilities Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Imports Roslyn.Test.Utilities Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests.Semantics Public Class AsyncAwait Inherits BasicTestBase <Fact()> Public Sub Basic() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System.Threading.Tasks Module Program Function Test1() As Task(Of Integer) Return Nothing End Function Async Sub Test2() Await Test1() Dim x As Integer = Await Test1() End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected></expected>) End Sub <Fact, WorkItem(744146, "https://devdiv.visualstudio.com/DevDiv/_workitems/edit/744146")> Public Sub DefaultAwaitExpressionInfo() Dim awaitInfo As AwaitExpressionInfo = Nothing Assert.Null(awaitInfo.GetAwaiterMethod) Assert.Null(awaitInfo.IsCompletedProperty) Assert.Null(awaitInfo.GetResultMethod) End Sub <Fact()> Public Sub AwaitableType01() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Function End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted As Boolean Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub Function GetResult() As T Throw New NotImplementedException() End Function End Structure Module Program Async Sub Test2() Dim x As Integer = Await New MyTask(Of Integer) 'BIND1:"Await New MyTask(Of Integer)" End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected></expected>) Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) Dim node1 As AwaitExpressionSyntax = CompilationUtils.FindBindingText(Of AwaitExpressionSyntax)(compilation, "a.vb", 1) Dim awaitInfo As AwaitExpressionInfo = semanticModel.GetAwaitExpressionInfo(node1) Assert.Equal("Function MyTask(Of System.Int32).GetAwaiter() As MyTaskAwaiter(Of System.Int32)", awaitInfo.GetAwaiterMethod.ToTestDisplayString()) Assert.Equal("ReadOnly Property MyTaskAwaiter(Of System.Int32).IsCompleted As System.Boolean", awaitInfo.IsCompletedProperty.ToTestDisplayString()) Assert.Equal("Function MyTaskAwaiter(Of System.Int32).GetResult() As System.Int32", awaitInfo.GetResultMethod.ToTestDisplayString()) End Sub <Fact()> Public Sub AwaitableType02() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) Function GetAwaiter(Optional x As Integer = 0) As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Function End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted As Boolean Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub Function GetResult() As T Throw New NotImplementedException() End Function End Structure Module Program Async Sub Test2() Dim x As Integer = Await New MyTask(Of Integer) 'BIND1:"Await New MyTask(Of Integer)" End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' error BC36930: 'Await' requires that the type 'MyTask(Of Integer)' have a suitable GetAwaiter method. AssertTheseDiagnostics(compilation, <expected> BC36930: 'Await' requires that the type 'MyTask(Of Integer)' have a suitable GetAwaiter method. Dim x As Integer = Await New MyTask(Of Integer) 'BIND1:"Await New MyTask(Of Integer)" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) Dim node1 As AwaitExpressionSyntax = CompilationUtils.FindBindingText(Of AwaitExpressionSyntax)(compilation, "a.vb", 1) Dim awaitInfo As AwaitExpressionInfo = semanticModel.GetAwaitExpressionInfo(node1) Assert.Null(awaitInfo.GetAwaiterMethod) Assert.Null(awaitInfo.IsCompletedProperty) Assert.Null(awaitInfo.GetResultMethod) End Sub <Fact()> Public Sub AwaitableType03() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) Sub GetAwaiter() End Sub End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted As Boolean Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub Function GetResult() As T Throw New NotImplementedException() End Function End Structure Module Program Async Sub Test2() Dim x As Integer = Await New MyTask(Of Integer) End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' error BC36949: Expression is of type 'MyTask(Of Integer)', which is not awaitable. AssertTheseDiagnostics(compilation, <expected> BC36930: 'Await' requires that the type 'MyTask(Of Integer)' have a suitable GetAwaiter method. Dim x As Integer = Await New MyTask(Of Integer) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaitableType04() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) Function GetAwaiter() As Object Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Function End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted As Boolean Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub Function GetResult() As T Throw New NotImplementedException() End Function End Structure Module Program Async Sub Test2() Dim x As Integer = Await New MyTask(Of Integer) End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' error BC36930: 'Await' requires that the type 'MyTask(Of Integer)' have a suitable GetAwaiter method. AssertTheseDiagnostics(compilation, <expected> BC36930: 'Await' requires that the type 'MyTask(Of Integer)' have a suitable GetAwaiter method. Dim x As Integer = Await New MyTask(Of Integer) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaitableType05() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) ReadOnly Property GetAwaiter As MyTaskAwaiter(Of T) Get Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Get End Property End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted As Boolean Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub Function GetResult() As T Throw New NotImplementedException() End Function End Structure Module Program Async Sub Test2() Dim x As Integer = Await New MyTask(Of Integer) Dim y = (New MyTask(Of Integer)).GetAwaiter End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' error BC36930: 'Await' requires that the type 'MyTask(Of Integer)' have a suitable GetAwaiter method. AssertTheseDiagnostics(compilation, <expected> BC36930: 'Await' requires that the type 'MyTask(Of Integer)' have a suitable GetAwaiter method. Dim x As Integer = Await New MyTask(Of Integer) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaitableType06() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) Protected Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Function End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted As Boolean Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub Function GetResult() As T Throw New NotImplementedException() End Function End Structure Module Program Async Sub Test2() Dim x As Integer = Await New MyTask(Of Integer) End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' error BC36949: Expression is of type 'MyTask(Of Integer)', which is not awaitable. AssertTheseDiagnostics(compilation, <expected> BC36930: 'Await' requires that the type 'MyTask(Of Integer)' have a suitable GetAwaiter method. Dim x As Integer = Await New MyTask(Of Integer) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaitableType07() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) Function GetAwaiter(x As Integer) As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Function End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted As Boolean Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub Function GetResult() As T Throw New NotImplementedException() End Function End Structure Module Program Async Sub Test2() Dim x As Integer = Await New MyTask(Of Integer) End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' error BC36949: Expression is of type 'MyTask(Of Integer)', which is not awaitable. AssertTheseDiagnostics(compilation, <expected> BC36930: 'Await' requires that the type 'MyTask(Of Integer)' have a suitable GetAwaiter method. Dim x As Integer = Await New MyTask(Of Integer) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaitableType08() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted As Boolean Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub Function GetResult() As T Throw New NotImplementedException() End Function End Structure Module Program Async Sub Test2() Dim x As Integer = Await New MyTask(Of Integer) End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' error BC36949: Expression is of type 'MyTask(Of Integer)', which is not awaitable. AssertTheseDiagnostics(compilation, <expected> BC36930: 'Await' requires that the type 'MyTask(Of Integer)' have a suitable GetAwaiter method. Dim x As Integer = Await New MyTask(Of Integer) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaitableType09() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) Shared Function GetAwaiter() As MyTaskAwaiter(Of T) Return Nothing End Function End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted As Boolean Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub Function GetResult() As T Throw New NotImplementedException() End Function End Structure Module Program Async Sub Test2() Dim x As Integer = Await New MyTask(Of Integer) End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' error BC36930: 'Await' requires that the type 'MyTask(Of Integer)' have a suitable GetAwaiter method. AssertTheseDiagnostics(compilation, <expected> BC36930: 'Await' requires that the type 'MyTask(Of Integer)' have a suitable GetAwaiter method. Dim x As Integer = Await New MyTask(Of Integer) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaitableType10() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) Function GetAwaiter() As MyTaskAwaiter(Of T) Return Nothing End Function End Class Module Program Async Sub Test2() Dim x As Integer = Await New MyTask(Of Integer) End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' error BC30002: Type 'MyTaskAwaiter' is not defined. ' error BC36949: Expression is of type 'MyTask(Of Integer)', which is not awaitable. AssertTheseDiagnostics(compilation, <expected> BC30002: Type 'MyTaskAwaiter' is not defined. Function GetAwaiter() As MyTaskAwaiter(Of T) ~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaitableType11() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted As Boolean Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub Function GetResult() As T Throw New NotImplementedException() End Function End Structure Module Program <Extension> Function GetAwaiter(Of T)(this As MyTask(Of T)) As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = this} End Function Async Sub Test2() Dim x As Integer = Await New MyTask(Of Integer) End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected></expected>) End Sub <Fact()> Public Sub AwaitableType12() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted As Boolean Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub Function GetResult() As T Throw New NotImplementedException() End Function End Structure Module Program <Extension> Function GetAwaiter(Of T)(this As MyTask(Of T), Optional x As Integer = 0) As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = this} End Function Async Sub Test2() Dim x As Integer = Await New MyTask(Of Integer) End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' error BC36930: 'Await' requires that the type 'MyTask(Of Integer)' have a suitable GetAwaiter method. AssertTheseDiagnostics(compilation, <expected> BC36930: 'Await' requires that the type 'MyTask(Of Integer)' have a suitable GetAwaiter method. Dim x As Integer = Await New MyTask(Of Integer) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaitableType13() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Function End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted As Boolean Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub Function GetResult() As T Throw New NotImplementedException() End Function End Structure Module Program Async Sub Test2() Dim o As Object = New MyTask(Of Integer) Dim x = Await o Await o End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected></expected>) compilation = compilation.WithOptions(compilation.Options.WithOptionStrict(OptionStrict.Custom)) AssertTheseDiagnostics(compilation, <expected> BC42017: Late bound resolution; runtime errors could occur. Dim x = Await o ~~~~~~~ BC42017: Late bound resolution; runtime errors could occur. Await o ~~~~~~~ </expected>) compilation = compilation.WithOptions(compilation.Options.WithOptionStrict(OptionStrict.On)) AssertTheseDiagnostics(compilation, <expected> BC30574: Option Strict On disallows late binding. Dim x = Await o ~~~~~~~ BC30574: Option Strict On disallows late binding. Await o ~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaitableType14() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Module Program Sub Test1() End Sub Async Sub Test2() Dim x As Integer = Await Test1() End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' error BC30491: Expression does not produce a value. AssertTheseDiagnostics(compilation, <expected> BC30491: Expression does not produce a value. Dim x As Integer = Await Test1() ~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaitableType15() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Function End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub Function GetResult() As T Throw New NotImplementedException() End Function End Structure Module Program Async Sub Test2() Dim x As Integer = Await New MyTask(Of Integer) 'BIND1:"Await New MyTask(Of Integer)" End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' error BC30456: 'IsCompleted' is not a member of 'MyTaskAwaiter(Of Integer)'. AssertTheseDiagnostics(compilation, <expected> BC37053: 'Await' requires that the return type 'MyTaskAwaiter(Of Integer)' of 'MyTask(Of Integer).GetAwaiter()' have suitable IsCompleted, OnCompleted and GetResult members, and implement INotifyCompletion or ICriticalNotifyCompletion. Dim x As Integer = Await New MyTask(Of Integer) 'BIND1:"Await New MyTask(Of Integer)" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) Dim node1 As AwaitExpressionSyntax = CompilationUtils.FindBindingText(Of AwaitExpressionSyntax)(compilation, "a.vb", 1) Dim awaitInfo As AwaitExpressionInfo = semanticModel.GetAwaitExpressionInfo(node1) Assert.Equal("Function MyTask(Of System.Int32).GetAwaiter() As MyTaskAwaiter(Of System.Int32)", awaitInfo.GetAwaiterMethod.ToTestDisplayString()) Assert.Null(awaitInfo.IsCompletedProperty) Assert.Equal("Function MyTaskAwaiter(Of System.Int32).GetResult() As System.Int32", awaitInfo.GetResultMethod.ToTestDisplayString()) End Sub <Fact()> Public Sub AwaitableType16() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Function End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) Private ReadOnly Property IsCompleted As Boolean Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub Function GetResult() As T Throw New NotImplementedException() End Function End Structure Module Program Async Sub Test2() Dim x As Integer = Await New MyTask(Of Integer) End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' BC30390: 'MyTaskAwaiter(Of T).Private ReadOnly Property IsCompleted As Boolean' is not accessible in this context because it is 'Private'. AssertTheseDiagnostics(compilation, <expected> BC37053: 'Await' requires that the return type 'MyTaskAwaiter(Of Integer)' of 'MyTask(Of Integer).GetAwaiter()' have suitable IsCompleted, OnCompleted and GetResult members, and implement INotifyCompletion or ICriticalNotifyCompletion. Dim x As Integer = Await New MyTask(Of Integer) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaitableType17() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Function End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) Function IsCompleted() As Boolean Throw New NotImplementedException() End Function Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub Function GetResult() As T Throw New NotImplementedException() End Function End Structure Module Program Async Sub Test2() Dim x As Integer = Await New MyTask(Of Integer) Dim y = (New MyTask(Of Integer)).GetAwaiter().IsCompleted End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' error BC37053: 'Await' requires that the return type 'MyTaskAwaiter(Of Integer)' of 'MyTask(Of Integer).GetAwaiter()' have suitable IsCompleted, OnCompleted and GetResult members, and implement INotifyCompletion or ICriticalNotifyCompletion. AssertTheseDiagnostics(compilation, <expected> BC37053: 'Await' requires that the return type 'MyTaskAwaiter(Of Integer)' of 'MyTask(Of Integer).GetAwaiter()' have suitable IsCompleted, OnCompleted and GetResult members, and implement INotifyCompletion or ICriticalNotifyCompletion. Dim x As Integer = Await New MyTask(Of Integer) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaitableType18() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Function End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted As Object Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub Function GetResult() As T Throw New NotImplementedException() End Function End Structure Module Program Async Sub Test2() Dim x As Integer = Await New MyTask(Of Integer) End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' error BC37053: 'Await' requires that the return type 'MyTaskAwaiter(Of Integer)' of 'MyTask(Of Integer).GetAwaiter()' have suitable IsCompleted, OnCompleted and GetResult members, and implement INotifyCompletion or ICriticalNotifyCompletion. AssertTheseDiagnostics(compilation, <expected> BC37053: 'Await' requires that the return type 'MyTaskAwaiter(Of Integer)' of 'MyTask(Of Integer).GetAwaiter()' have suitable IsCompleted, OnCompleted and GetResult members, and implement INotifyCompletion or ICriticalNotifyCompletion. Dim x As Integer = Await New MyTask(Of Integer) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaitableType19() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Function End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted(x As Integer) As Boolean Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub Function GetResult() As T Throw New NotImplementedException() End Function End Structure Module Program Async Sub Test2() Dim x As Integer = Await New MyTask(Of Integer) End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' error BC30455: Argument not specified for parameter 'x' of 'Public ReadOnly Property IsCompleted(x As Integer) As Boolean'. AssertTheseDiagnostics(compilation, <expected> BC37053: 'Await' requires that the return type 'MyTaskAwaiter(Of Integer)' of 'MyTask(Of Integer).GetAwaiter()' have suitable IsCompleted, OnCompleted and GetResult members, and implement INotifyCompletion or ICriticalNotifyCompletion. Dim x As Integer = Await New MyTask(Of Integer) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaitableType20() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Function End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted(Optional x As Integer = 0) As Boolean Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub Function GetResult() As T Throw New NotImplementedException() End Function End Structure Module Program Async Sub Test2() Dim x As Integer = Await New MyTask(Of Integer) Dim y = (New MyTask(Of Integer)).GetAwaiter().IsCompleted End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' error BC37053: 'Await' requires that the return type 'MyTaskAwaiter(Of Integer)' of 'MyTask(Of Integer).GetAwaiter()' have suitable IsCompleted, OnCompleted and GetResult members, and implement INotifyCompletion or ICriticalNotifyCompletion. AssertTheseDiagnostics(compilation, <expected> BC37053: 'Await' requires that the return type 'MyTaskAwaiter(Of Integer)' of 'MyTask(Of Integer).GetAwaiter()' have suitable IsCompleted, OnCompleted and GetResult members, and implement INotifyCompletion or ICriticalNotifyCompletion. Dim x As Integer = Await New MyTask(Of Integer) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaitableType21() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Function End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) Shared ReadOnly Property IsCompleted() As Boolean Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub Function GetResult() As T Throw New NotImplementedException() End Function End Structure Module Program Async Sub Test2() Dim x As Integer = Await New MyTask(Of Integer) Dim y = MyTaskAwaiter(Of Integer).IsCompleted End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' warning BC42025: Access of shared member, constant member, enum member or nested type through an instance; qualifying expression will not be evaluated. ' error BC37053: 'Await' requires that the return type 'MyTaskAwaiter(Of Integer)' of 'MyTask(Of Integer).GetAwaiter()' have suitable IsCompleted, OnCompleted and GetResult members, and implement INotifyCompletion or ICriticalNotifyCompletion. AssertTheseDiagnostics(compilation, <expected> BC37053: 'Await' requires that the return type 'MyTaskAwaiter(Of Integer)' of 'MyTask(Of Integer).GetAwaiter()' have suitable IsCompleted, OnCompleted and GetResult members, and implement INotifyCompletion or ICriticalNotifyCompletion. Dim x As Integer = Await New MyTask(Of Integer) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaitableType22() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Function End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted() As DoesntExist Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub Function GetResult() As T Throw New NotImplementedException() End Function End Structure Module Program Async Sub Test2() Dim x As Integer = Await New MyTask(Of Integer) End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' error BC30002: Type 'DoesntExist' is not defined. AssertTheseDiagnostics(compilation, <expected> BC30002: Type 'DoesntExist' is not defined. ReadOnly Property IsCompleted() As DoesntExist ~~~~~~~~~~~ BC37053: 'Await' requires that the return type 'MyTaskAwaiter(Of Integer)' of 'MyTask(Of Integer).GetAwaiter()' have suitable IsCompleted, OnCompleted and GetResult members, and implement INotifyCompletion or ICriticalNotifyCompletion. Dim x As Integer = Await New MyTask(Of Integer) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaitableType23() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Function End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted() As Boolean Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub End Structure Module Program Async Sub Test2() Dim x As Integer = Await New MyTask(Of Integer) 'BIND1:"Await New MyTask(Of Integer)" End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' error BC30456: 'GetResult' is not a member of 'MyTaskAwaiter(Of Integer)'. AssertTheseDiagnostics(compilation, <expected> BC37053: 'Await' requires that the return type 'MyTaskAwaiter(Of Integer)' of 'MyTask(Of Integer).GetAwaiter()' have suitable IsCompleted, OnCompleted and GetResult members, and implement INotifyCompletion or ICriticalNotifyCompletion. Dim x As Integer = Await New MyTask(Of Integer) 'BIND1:"Await New MyTask(Of Integer)" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) Dim node1 As AwaitExpressionSyntax = CompilationUtils.FindBindingText(Of AwaitExpressionSyntax)(compilation, "a.vb", 1) Dim awaitInfo As AwaitExpressionInfo = semanticModel.GetAwaitExpressionInfo(node1) Assert.Equal("Function MyTask(Of System.Int32).GetAwaiter() As MyTaskAwaiter(Of System.Int32)", awaitInfo.GetAwaiterMethod.ToTestDisplayString()) Assert.Equal("ReadOnly Property MyTaskAwaiter(Of System.Int32).IsCompleted As System.Boolean", awaitInfo.IsCompletedProperty.ToTestDisplayString()) Assert.Null(awaitInfo.GetResultMethod) End Sub <Fact()> Public Sub AwaitableType24() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Function End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted() As Boolean Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub Private Function GetResult() As T Throw New NotImplementedException() End Function End Structure Module Program Async Sub Test2() Dim x As Integer = Await New MyTask(Of Integer) End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' error BC30390: 'MyTaskAwaiter(Of T).Private Function GetResult() As T' is not accessible in this context because it is 'Private'. AssertTheseDiagnostics(compilation, <expected> BC37053: 'Await' requires that the return type 'MyTaskAwaiter(Of Integer)' of 'MyTask(Of Integer).GetAwaiter()' have suitable IsCompleted, OnCompleted and GetResult members, and implement INotifyCompletion or ICriticalNotifyCompletion. Dim x As Integer = Await New MyTask(Of Integer) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaitableType25() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Function End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted() As Boolean Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub Function GetResult(x As Integer) As T Throw New NotImplementedException() End Function End Structure Module Program Async Sub Test2() Dim x As Integer = Await New MyTask(Of Integer) End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' error BC30455: Argument not specified for parameter 'x' of 'Public Function GetResult(x As Integer) As T'. AssertTheseDiagnostics(compilation, <expected> BC37053: 'Await' requires that the return type 'MyTaskAwaiter(Of Integer)' of 'MyTask(Of Integer).GetAwaiter()' have suitable IsCompleted, OnCompleted and GetResult members, and implement INotifyCompletion or ICriticalNotifyCompletion. Dim x As Integer = Await New MyTask(Of Integer) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaitableType26() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Function End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted() As Boolean Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub Function GetResult(Optional x As Integer = 0) As T Throw New NotImplementedException() End Function End Structure Module Program Async Sub Test2() Dim x As Integer = Await New MyTask(Of Integer) End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' error BC37053: 'Await' requires that the return type 'MyTaskAwaiter(Of Integer)' of 'MyTask(Of Integer).GetAwaiter()' have suitable IsCompleted, OnCompleted and GetResult members, and implement INotifyCompletion or ICriticalNotifyCompletion. AssertTheseDiagnostics(compilation, <expected> BC37053: 'Await' requires that the return type 'MyTaskAwaiter(Of Integer)' of 'MyTask(Of Integer).GetAwaiter()' have suitable IsCompleted, OnCompleted and GetResult members, and implement INotifyCompletion or ICriticalNotifyCompletion. Dim x As Integer = Await New MyTask(Of Integer) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaitableType27() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Function End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted() As Boolean Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub Shared Function GetResult() As T Throw New NotImplementedException() End Function End Structure Module Program Async Sub Test2() Dim x As Integer = Await New MyTask(Of Integer) End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' warning BC42025: Access of shared member, constant member, enum member or nested type through an instance; qualifying expression will not be evaluated. ' error BC37053: 'Await' requires that the return type 'MyTaskAwaiter(Of Integer)' of 'MyTask(Of Integer).GetAwaiter()' have suitable IsCompleted, OnCompleted and GetResult members, and implement INotifyCompletion or ICriticalNotifyCompletion. AssertTheseDiagnostics(compilation, <expected> BC37053: 'Await' requires that the return type 'MyTaskAwaiter(Of Integer)' of 'MyTask(Of Integer).GetAwaiter()' have suitable IsCompleted, OnCompleted and GetResult members, and implement INotifyCompletion or ICriticalNotifyCompletion. Dim x As Integer = Await New MyTask(Of Integer) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaitableType28() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Function End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted() As Boolean Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub ReadOnly Property GetResult() As T Get Throw New NotImplementedException() End Get End Property End Structure Module Program Async Sub Test2() Dim x As Integer = Await New MyTask(Of Integer) Dim Y = (New MyTask(Of Integer)).GetAwaiter().GetResult End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' error BC37053: 'Await' requires that the return type 'MyTaskAwaiter(Of Integer)' of 'MyTask(Of Integer).GetAwaiter()' have suitable IsCompleted, OnCompleted and GetResult members, and implement INotifyCompletion or ICriticalNotifyCompletion. AssertTheseDiagnostics(compilation, <expected> BC37053: 'Await' requires that the return type 'MyTaskAwaiter(Of Integer)' of 'MyTask(Of Integer).GetAwaiter()' have suitable IsCompleted, OnCompleted and GetResult members, and implement INotifyCompletion or ICriticalNotifyCompletion. Dim x As Integer = Await New MyTask(Of Integer) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaitableType29() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Function End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted() As Boolean Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub End Structure Module Program <Extension> Function GetResult(Of t)(X As MyTaskAwaiter(Of t)) As t Throw New NotImplementedException() End Function Async Sub Test2() Dim x As Integer = Await New MyTask(Of Integer) Dim Y = (New MyTask(Of Integer)).GetAwaiter().GetResult End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' error BC37053: 'Await' requires that the return type 'MyTaskAwaiter(Of Integer)' of 'MyTask(Of Integer).GetAwaiter()' have suitable IsCompleted, OnCompleted and GetResult members, and implement INotifyCompletion or ICriticalNotifyCompletion. AssertTheseDiagnostics(compilation, <expected> BC37053: 'Await' requires that the return type 'MyTaskAwaiter(Of Integer)' of 'MyTask(Of Integer).GetAwaiter()' have suitable IsCompleted, OnCompleted and GetResult members, and implement INotifyCompletion or ICriticalNotifyCompletion. Dim x As Integer = Await New MyTask(Of Integer) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaitableType30() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Function End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted() As Boolean Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub Function GetResult() As DoesntExist Throw New NotImplementedException() End Function End Structure Module Program Async Sub Test2() Dim x As Integer = Await New MyTask(Of Integer) End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' error BC30002: Type 'DoesntExist' is not defined. AssertTheseDiagnostics(compilation, <expected> BC30002: Type 'DoesntExist' is not defined. Function GetResult() As DoesntExist ~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaitableType31() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Function End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted() As Boolean Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub Sub GetResult() Throw New NotImplementedException() End Sub End Structure Module Program Async Sub Test2() Dim x As Integer = Await New MyTask(Of Integer) Await New MyTask(Of Integer) End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' error BC30491: Expression does not produce a value. AssertTheseDiagnostics(compilation, <expected> BC30491: Expression does not produce a value. Dim x As Integer = Await New MyTask(Of Integer) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaitableType32() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Function End Class Structure MyTaskAwaiter(Of T) Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted() As Boolean Get Throw New NotImplementedException() End Get End Property Function GetResult() As T Throw New NotImplementedException() End Function End Structure Module Program Async Sub Test2() Await New MyTask(Of Integer) 'BIND1:"Await New MyTask(Of Integer)" End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' error BC37056: 'MyTaskAwaiter(Of Integer)' does not implement 'System.Runtime.CompilerServices.INotifyCompletion'. AssertTheseDiagnostics(compilation, <expected> BC37056: 'MyTaskAwaiter(Of Integer)' does not implement 'INotifyCompletion'. Await New MyTask(Of Integer) 'BIND1:"Await New MyTask(Of Integer)" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) Dim tree As SyntaxTree = (From t In compilation.SyntaxTrees Where t.FilePath = "a.vb").Single() Dim semanticModel = compilation.GetSemanticModel(tree) Dim node1 As AwaitExpressionSyntax = CompilationUtils.FindBindingText(Of AwaitExpressionSyntax)(compilation, "a.vb", 1) Dim awaitInfo As AwaitExpressionInfo = semanticModel.GetAwaitExpressionInfo(node1) Assert.Equal("Function MyTask(Of System.Int32).GetAwaiter() As MyTaskAwaiter(Of System.Int32)", awaitInfo.GetAwaiterMethod.ToTestDisplayString()) Assert.Equal("ReadOnly Property MyTaskAwaiter(Of System.Int32).IsCompleted As System.Boolean", awaitInfo.IsCompletedProperty.ToTestDisplayString()) Assert.Equal("Function MyTaskAwaiter(Of System.Int32).GetResult() As System.Int32", awaitInfo.GetResultMethod.ToTestDisplayString()) End Sub <Fact()> Public Sub AwaitableType33() Dim source = <compilation name="MissingINotifyCompletion"> <file name="a.vb"> <![CDATA[ Imports System Class MyTask(Of T) Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Function End Class Structure MyTaskAwaiter(Of T) Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted() As Boolean Get Throw New NotImplementedException() End Get End Property Function GetResult() As T Throw New NotImplementedException() End Function End Structure Module Program Async Sub Test2() Await New MyTask(Of Integer) End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {Net40.References.mscorlib, Net40.References.MicrosoftVisualBasic}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected> BC31091: Import of type 'INotifyCompletion' from assembly or module 'MissingINotifyCompletion.exe' failed. Await New MyTask(Of Integer) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaitableType34() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Module Program Async Sub Test0() Await Task.Delay(1) End Sub Async Sub Test1() Await Test0() End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected> BC37001: 'Test0' does not return a Task and cannot be awaited. Consider changing it to an Async Function. Await Test0() ~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaitableType35() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Function End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted() As Boolean Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub #Const defined = True <System.Diagnostics.Conditional("defined")> Sub GetResult() Throw New NotImplementedException() End Sub End Structure Module Program Async Sub Test1() Await New MyTask(Of Integer)() End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected> BC37053: 'Await' requires that the return type 'MyTaskAwaiter(Of Integer)' of 'MyTask(Of Integer).GetAwaiter()' have suitable IsCompleted, OnCompleted and GetResult members, and implement INotifyCompletion or ICriticalNotifyCompletion. Await New MyTask(Of Integer)() ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaiterImplementsINotifyCompletion_Constraint() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System.Runtime.CompilerServices Class Awaitable(Of T) Friend Function GetAwaiter() As T Return Nothing End Function End Class Interface IA ReadOnly Property IsCompleted As Boolean Function GetResult() As Object End Interface Interface IB Inherits IA, INotifyCompletion End Interface Class A Friend ReadOnly Property IsCompleted As Boolean Get Return True End Get End Property Friend Function GetResult() As Object Return Nothing End Function End Class Class B Inherits A Implements INotifyCompletion Private Sub OnCompleted(a As System.Action) Implements INotifyCompletion.OnCompleted End Sub End Class Module M Async Sub F(Of T1 As IA, T2 As {IA, INotifyCompletion}, T3 As IB, T4 As {T1, INotifyCompletion}, T5 As T3, T6 As A, T7 As {A, INotifyCompletion}, T8 As B, T9 As {T6, INotifyCompletion}, T10 As T8)() Await New Awaitable(Of T1)() Await New Awaitable(Of T2)() Await New Awaitable(Of T3)() Await New Awaitable(Of T4)() Await New Awaitable(Of T5)() Await New Awaitable(Of T6)() Await New Awaitable(Of T7)() Await New Awaitable(Of T8)() Await New Awaitable(Of T9)() Await New Awaitable(Of T10)() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}) compilation.AssertTheseDiagnostics( <expected> BC37056: 'T1' does not implement 'INotifyCompletion'. Await New Awaitable(Of T1)() ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ BC37056: 'T6' does not implement 'INotifyCompletion'. Await New Awaitable(Of T6)() ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </expected>) End Sub ''' <summary> ''' Should call ICriticalNotifyCompletion.UnsafeOnCompleted ''' if the awaiter type implements ICriticalNotifyCompletion. ''' </summary> <Fact()> Public Sub AwaiterImplementsICriticalNotifyCompletion_Constraint() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class Awaitable(Of T) Friend Function GetAwaiter() As T Return Nothing End Function End Class Class A Implements INotifyCompletion Private Sub OnCompleted(a As Action) Implements INotifyCompletion.OnCompleted End Sub Friend ReadOnly Property IsCompleted As Boolean Get Return True End Get End Property Friend Function GetResult() As Object Return Nothing End Function End Class Class B Inherits A Implements ICriticalNotifyCompletion Private Sub UnsafeOnCompleted(a As Action) Implements ICriticalNotifyCompletion.UnsafeOnCompleted End Sub End Class Module M Async Sub F(Of T1 As A, T2 As {A, ICriticalNotifyCompletion}, T3 As B, T4 As T1, T5 As T2, T6 As {T1, ICriticalNotifyCompletion})() Await New Awaitable(Of T1)() Await New Awaitable(Of T2)() Await New Awaitable(Of T3)() Await New Awaitable(Of T4)() Await New Awaitable(Of T5)() Await New Awaitable(Of T6)() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}) Dim verifier = CompileAndVerify(compilation) Dim actualIL = verifier.VisualizeIL("M.VB$StateMachine_0_F(Of SM$T1, SM$T2, SM$T3, SM$T4, SM$T5, SM$T6).MoveNext()") Dim calls = actualIL.Split({vbCr, vbLf}, StringSplitOptions.RemoveEmptyEntries).Where(Function(s) s.Contains("OnCompleted")).ToArray() Assert.Equal(calls.Length, 6) Assert.Equal(calls(0), <![CDATA[ IL_0058: call "Sub System.Runtime.CompilerServices.AsyncVoidMethodBuilder.AwaitOnCompleted(Of SM$T1, M.VB$StateMachine_0_F(Of SM$T1, SM$T2, SM$T3, SM$T4, SM$T5, SM$T6))(ByRef SM$T1, ByRef M.VB$StateMachine_0_F(Of SM$T1, SM$T2, SM$T3, SM$T4, SM$T5, SM$T6))"]]>.Value) Assert.Equal(calls(1), <![CDATA[ IL_00c7: call "Sub System.Runtime.CompilerServices.AsyncVoidMethodBuilder.AwaitUnsafeOnCompleted(Of SM$T2, M.VB$StateMachine_0_F(Of SM$T1, SM$T2, SM$T3, SM$T4, SM$T5, SM$T6))(ByRef SM$T2, ByRef M.VB$StateMachine_0_F(Of SM$T1, SM$T2, SM$T3, SM$T4, SM$T5, SM$T6))"]]>.Value) Assert.Equal(calls(2), <![CDATA[ IL_0136: call "Sub System.Runtime.CompilerServices.AsyncVoidMethodBuilder.AwaitUnsafeOnCompleted(Of SM$T3, M.VB$StateMachine_0_F(Of SM$T1, SM$T2, SM$T3, SM$T4, SM$T5, SM$T6))(ByRef SM$T3, ByRef M.VB$StateMachine_0_F(Of SM$T1, SM$T2, SM$T3, SM$T4, SM$T5, SM$T6))"]]>.Value) Assert.Equal(calls(3), <![CDATA[ IL_01a7: call "Sub System.Runtime.CompilerServices.AsyncVoidMethodBuilder.AwaitOnCompleted(Of SM$T4, M.VB$StateMachine_0_F(Of SM$T1, SM$T2, SM$T3, SM$T4, SM$T5, SM$T6))(ByRef SM$T4, ByRef M.VB$StateMachine_0_F(Of SM$T1, SM$T2, SM$T3, SM$T4, SM$T5, SM$T6))"]]>.Value) Assert.Equal(calls(4), <![CDATA[ IL_0219: call "Sub System.Runtime.CompilerServices.AsyncVoidMethodBuilder.AwaitUnsafeOnCompleted(Of SM$T5, M.VB$StateMachine_0_F(Of SM$T1, SM$T2, SM$T3, SM$T4, SM$T5, SM$T6))(ByRef SM$T5, ByRef M.VB$StateMachine_0_F(Of SM$T1, SM$T2, SM$T3, SM$T4, SM$T5, SM$T6))"]]>.Value) Assert.Equal(calls(5), <![CDATA[ IL_028b: call "Sub System.Runtime.CompilerServices.AsyncVoidMethodBuilder.AwaitUnsafeOnCompleted(Of SM$T6, M.VB$StateMachine_0_F(Of SM$T1, SM$T2, SM$T3, SM$T4, SM$T5, SM$T6))(ByRef SM$T6, ByRef M.VB$StateMachine_0_F(Of SM$T1, SM$T2, SM$T3, SM$T4, SM$T5, SM$T6))"]]>.Value) End Sub <Fact()> Public Sub Assignment() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Class MyTask(Of T) Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Function End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted() As Boolean Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub Function GetResult() As T Throw New NotImplementedException() End Function End Structure Module Program Async Sub Test2() Await (New MyTask(Of Integer))=1 End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' error BC30205: End of statement expected. AssertTheseDiagnostics(compilation, <expected> BC30205: End of statement expected. Await (New MyTask(Of Integer))=1 ~ </expected>) End Sub <Fact()> Public Sub AwaitNothing() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Module Program Async Sub Test2() Await Nothing End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' error BC36933: Cannot await Nothing. Consider awaiting 'Task.Yield()' instead. AssertTheseDiagnostics(compilation, <expected> BC36933: Cannot await Nothing. Consider awaiting 'Task.Yield()' instead. Await Nothing ~~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AwaitInQuery() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Runtime.CompilerServices Imports System.Linq.Enumerable Class MyTask(Of T) Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Function End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted() As Boolean Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub Function GetResult() As T Throw New NotImplementedException() End Function End Structure Module Program Async Sub Test2() Dim y = From x In {1} Where x <> Await New MyTask(Of Integer) Dim z = From x In {Await New MyTask(Of Integer)} Where x <> 0 Await New MyTask(Of Integer) End Sub Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) ' error BC36929: 'Await' may only be used in a query expression within the first collection expression of the initial 'From' clause or within the collection expression of a 'Join' clause. AssertTheseDiagnostics(compilation, <expected><![CDATA[ BC36929: 'Await' may only be used in a query expression within the first collection expression of the initial 'From' clause or within the collection expression of a 'Join' clause. Dim y = From x In {1} Where x <> Await New MyTask(Of Integer) ~~~~~ ]]></expected>) End Sub <Fact()> Public Sub MisplacedAsyncModifier() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Public Module Program1 Sub Main() End Sub Async Class Test1 End Class Async Structure Test2 End Structure Async Enum Test3 X End Enum Async Interface Test4 End Interface Class Test5 Private Async Test6 As Object Async Property Test7 As Object Async Event Test8(x As Object) Async Sub Test9(ByRef x As Integer) Await Task.Delay(x) Dim Async Test10 As Object End Sub End Class Async Delegate Sub Test11() Async Declare Sub Test12 Lib "ddd" () Interface I1 Async Sub Test13() End Interface Enum E1 Async Test14 End Enum Structure S1 Async Sub Test15() Await Task.Delay(1) Async Test16 As Object End Sub End Structure Async Iterator Function Test17() As Object End Function End Module Async Module Program2 End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected> BC30461: Classes cannot be declared 'Async'. Async Class Test1 ~~~~~ BC30395: 'Async' is not valid on a Structure declaration. Async Structure Test2 ~~~~~ BC30396: 'Async' is not valid on an Enum declaration. Async Enum Test3 ~~~~~ BC30397: 'Async' is not valid on an Interface declaration. Async Interface Test4 ~~~~~ BC30235: 'Async' is not valid on a member variable declaration. Private Async Test6 As Object ~~~~~ BC30639: Properties cannot be declared 'Async'. Async Property Test7 As Object ~~~~~ BC30243: 'Async' is not valid on an event declaration. Async Event Test8(x As Object) ~~~~~ BC36926: Async methods cannot have ByRef parameters. Async Sub Test9(ByRef x As Integer) ~~~~~~~~~~~~~~~~~~ BC30247: 'Async' is not valid on a local variable declaration. Dim Async Test10 As Object ~~~~~ BC42024: Unused local variable: 'Test10'. Dim Async Test10 As Object ~~~~~~ BC30385: 'Async' is not valid on a Delegate declaration. Async Delegate Sub Test11() ~~~~~ BC30244: 'Async' is not valid on a Declare. Async Declare Sub Test12 Lib "ddd" () ~~~~~ BC30270: 'Async' is not valid on an interface method declaration. Async Sub Test13() ~~~~~ BC30205: End of statement expected. Async Test14 ~~~~~~ BC30247: 'Async' is not valid on a local variable declaration. Async Test16 As Object ~~~~~ BC42024: Unused local variable: 'Test16'. Async Test16 As Object ~~~~~~ BC36936: 'Async' and 'Iterator' modifiers cannot be used together. Async Iterator Function Test17() As Object ~~~~~ BC31052: Modules cannot be declared 'Async'. Async Module Program2 ~~~~~ </expected>) End Sub <Fact()> Public Sub ReferToReturnVariable() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Module Program Async Sub Test0() Dim x = Test0 Await Task.Delay(1) End Sub Async Function Test1() As Task Dim x = Test1 Await Task.Delay(1) End Function Async Function Test2() As Task(Of Integer) Dim x = Test2 Await Task.Delay(1) End Function Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected> BC30491: Expression does not produce a value. Dim x = Test0 ~~~~~ BC36946: The implicit return variable of an Iterator or Async method cannot be accessed. Dim x = Test1 ~~~~~ BC36946: The implicit return variable of an Iterator or Async method cannot be accessed. Dim x = Test2 ~~~~~ BC42105: Function 'Test2' 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 ~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub ReturnStatements() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Module Program Async Sub Test0() Await Task.Delay(1) Dim x As Integer = 1 If x = 3 Then Return Nothing ' 0 Else Return End If End Sub Async Function Test1() As Task Await Task.Delay(1) Dim x As Integer = 1 If x = 3 Then Return Nothing ' 1 ElseIf x = 2 Then Return ' 1 Else Return Task.Delay(1) End If End Function Async Function Test2() As Task Await Task.Delay(2) End Function Async Function Test3() As Task(Of Integer) Await Task.Delay(3) Return 3 End Function Async Function Test4() As Task(Of Integer) Await Task.Delay(3) Return Test3() End Function Async Function Test5() As Object Await Task.Delay(3) Return Nothing ' 5 End Function Async Function Test6() As Task(Of Integer) Await Task.Delay(6) Return New Guid() End Function Sub Main() End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected> BC30647: 'Return' statement in a Sub or a Set cannot return a value. Return Nothing ' 0 ~~~~~~~~~~~~~~ BC36952: 'Return' statements in this Async method cannot return a value since the return type of the function is 'Task'. Consider changing the function's return type to 'Task(Of T)'. Return Nothing ' 1 ~~~~~~~~~~~~~~ BC36952: 'Return' statements in this Async method cannot return a value since the return type of the function is 'Task'. Consider changing the function's return type to 'Task(Of T)'. Return Task.Delay(1) ~~~~~~~~~~~~~~~~~~~~ BC37055: Since this is an async method, the return expression must be of type 'Integer' rather than 'Task(Of Integer)'. Return Test3() ~~~~~~~ BC36945: The 'Async' modifier can only be used on Subs, or on Functions that return Task or Task(Of T). Async Function Test5() As Object ~~~~~~ BC30311: Value of type 'Guid' cannot be converted to 'Integer'. Return New Guid() ~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub Lambdas() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Module Program Delegate Function D1() As Object Delegate Sub D2(ByRef x As Integer) Sub Main() Dim x00 = Async Sub() Await Task.Delay(0) End Sub Dim x01 = Async Iterator Function() As Object Return Nothing End Function ' 1 Dim x02 = Async Function() As Object Await Task.Delay(3) Return Nothing ' 5 End Function '2 Dim x03 As D1 = Async Function() Await Task.Delay(3) Return Nothing ' 5 End Function '3 Dim x04 = Async Sub(ByRef x As Integer) Await Task.Delay(0) End Sub Dim x05 As D2 = Async Sub(x) Await Task.Delay(0) End Sub Dim x06 As D2 = Async Sub(ByRef x) Await Task.Delay(0) End Sub Dim x07 = Async Iterator Function() As Object Await Task.Delay(0) Return Nothing End Function ' 4 Dim x08 = Sub() Await Task.Delay(0) ' x08 End Sub Dim x09 = Async Sub() Await Task.Delay(0) Dim x10 = Sub() Await Task.Delay(0) ' x10 End Sub End Sub Dim x11 = Async Function() Await Task.Delay(0) Dim x As Integer = 0 If x = 0 Then Return CByte(1) Else Return 1 End If End Function ' 5 Dim x12 As Func(Of Task(Of Integer)) = x11 Dim x13 As Func(Of Task(Of Byte)) = x11 Dim x14 = Async Function() Await New Task(Of Byte)(Function() 1) x12 = x14 x13 = x14 Dim x15 = Async Function() Await Task.Delay(0) End Function ' 6 Dim x16 As Func(Of Task) = x15 Dim x17 As Func(Of Integer) = x15 Dim x18 = Async Function() Await Task.Delay(0) Return End Function ' 7 x16 = x18 x17 = x18 Dim x19 = Async Function() Await Task.Delay(0) Dim x As Integer = 0 If x = 0 Then Return ' x19 Else Return 1 End If End Function ' 8 Dim x20 As Func(Of Object) = Async Function() Await Task.Delay(0) End Function ' 9 Dim x21 As Func(Of Object) = Async Function() Await New Task(Of Byte)(Function() 1) Dim x22 As Func(Of Object) = Async Function() Await Task.Delay(0) Return 1 End Function ' 10 'Dim x23 As Action = Async Function() ' Expected BC42359: The Task returned from this Async Function will be dropped, and any exceptions in it ignored. Consider changing it to an Async Sub so its exceptions are propagated. ' Await Task.Delay(0) ' End Function ' 11 'Dim x24 As Action = Async Function() ' Expected BC42359: The Task returned from this Async Function will be dropped, and any exceptions in it ignored. Consider changing it to an Async Sub so its exceptions are propagated. ' Await Task.Delay(0) ' Return 1 ' End Function ' 12 Dim x25 As Func(Of Task) = Async Function() Await Task.Delay(0) End Function ' 12 Dim x26 As Func(Of Task) = Async Function() Await New Task(Of Byte)(Function() 1) Dim x27 As Func(Of Task) = Async Function() Await Task.Delay(0) Return 1 End Function ' 13 'Dim x28 = Async Overridable Sub() ' Await Task.Delay(0) ' End Sub 'Dim x29 = Async Iterator Overridable Sub() ' Await Task.Delay(0) ' End Sub Dim x30 = Overridable Sub() End Sub ' x30 'Dim x31 = Async Main End Sub ' Main Async Sub Test() Await Task.Delay(0) Dim x04 = Sub(ByRef x As Integer) End Sub End Sub Sub Test2() Dim x40 = Async Iterator Function() 1 Dim x41 = Async Iterator Function() Yield 1 End Function ' 14 End Sub End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected><![CDATA[ BC36936: 'Async' and 'Iterator' modifiers cannot be used together. Dim x01 = Async Iterator Function() As Object ~~~~~ BC36945: The 'Async' modifier can only be used on Subs, or on Functions that return Task or Task(Of T). Dim x02 = Async Function() As Object ~~~~~~ BC36945: The 'Async' modifier can only be used on Subs, or on Functions that return Task or Task(Of T). Dim x03 As D1 = Async Function() ~~~~~~~~~~~~~~~~ BC36926: Async methods cannot have ByRef parameters. Dim x04 = Async Sub(ByRef x As Integer) ~~~~~~~~~~~~~~~~~~ BC36670: Nested sub does not have a signature that is compatible with delegate 'Delegate Sub Program.D2(ByRef x As Integer)'. Dim x05 As D2 = Async Sub(x) ~~~~~~~~~~~~~ BC36926: Async methods cannot have ByRef parameters. Dim x06 As D2 = Async Sub(ByRef x) ~~~~~~~ BC36936: 'Async' and 'Iterator' modifiers cannot be used together. Dim x07 = Async Iterator Function() As Object ~~~~~ BC37059: 'Await' can only be used within an Async lambda expression. Consider marking this lambda expression with the 'Async' modifier. Await Task.Delay(0) ' x08 ~~~~~ BC30800: Method arguments must be enclosed in parentheses. Await Task.Delay(0) ' x08 ~~~~~~~~~~~~~~ BC37059: 'Await' can only be used within an Async lambda expression. Consider marking this lambda expression with the 'Async' modifier. Await Task.Delay(0) ' x10 ~~~~~ BC30800: Method arguments must be enclosed in parentheses. Await Task.Delay(0) ' x10 ~~~~~~~~~~~~~~ BC30311: Value of type 'Function <generated method>() As Task(Of Integer)' cannot be converted to 'Func(Of Task(Of Byte))'. Dim x13 As Func(Of Task(Of Byte)) = x11 ~~~ BC30311: Value of type 'Function <generated method>() As Task(Of Byte)' cannot be converted to 'Func(Of Task(Of Integer))'. x12 = x14 ~~~ BC30311: Value of type 'Function <generated method>() As Task' cannot be converted to 'Func(Of Integer)'. Dim x17 As Func(Of Integer) = x15 ~~~ BC30311: Value of type 'Function <generated method>() As Task' cannot be converted to 'Func(Of Integer)'. x17 = x18 ~~~ BC30654: 'Return' statement in a Function, Get, or Operator must return a value. Return ' x19 ~~~~~~ BC36945: The 'Async' modifier can only be used on Subs, or on Functions that return Task or Task(Of T). Dim x20 As Func(Of Object) = Async Function() ~~~~~~~~~~~~~~~~ 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 ' 9 ~~~~~~~~~~~~ BC36945: The 'Async' modifier can only be used on Subs, or on Functions that return Task or Task(Of T). Dim x21 As Func(Of Object) = Async Function() Await New Task(Of Byte)(Function() 1) ~~~~~~~~~~~~~~~~ BC36945: The 'Async' modifier can only be used on Subs, or on Functions that return Task or Task(Of T). Dim x22 As Func(Of Object) = Async Function() ~~~~~~~~~~~~~~~~ BC30201: Expression expected. Dim x30 = Overridable Sub() ~ BC30429: 'End Sub' must be preceded by a matching 'Sub'. End Sub ' Main ~~~~~~~ BC36936: 'Async' and 'Iterator' modifiers cannot be used together. Dim x40 = Async Iterator Function() 1 ~~~~~ BC36947: Single-line lambdas cannot have the 'Iterator' modifier. Use a multiline lambda instead. Dim x40 = Async Iterator Function() 1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ BC36936: 'Async' and 'Iterator' modifiers cannot be used together. Dim x41 = Async Iterator Function() ~~~~~ ]]></expected>) End Sub <Fact()> Public Sub LambdaRelaxation() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Module Program Sub Main() Dim x = CandidateMethod(Async Function() Await Task.Delay(1) End Function) End Sub Function CandidateMethod(f As Func(Of Task)) As Object System.Console.WriteLine("CandidateMethod(f As Func(Of Task)) As Object") Return Nothing End Function Sub CandidateMethod(f As Func(Of Task(Of Integer))) End Sub Sub CandidateMethod(f As Func(Of Task(Of Double))) End Sub End Module ]]></file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) CompileAndVerify(compilation, <![CDATA[ CandidateMethod(f As Func(Of Task)) As Object ]]>).VerifyDiagnostics() End Sub <Fact()> Public Sub MissingTypes() Dim source = <compilation name="MissingTaskTypes"> <file name="a.vb"> <![CDATA[ Imports System Class Program Shared Sub Main() Dim x = Async Function() End Function Dim y = Async Function() 1 Dim z = Async Function() return 1 End Function End Sub End Class ]]></file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v20}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected><![CDATA[ BC31091: Import of type 'Task' from assembly or module 'MissingTaskTypes.exe' failed. Dim x = Async Function() ~~~~~~~~~~~~~~~~~ BC31091: Import of type 'Task(Of )' from assembly or module 'MissingTaskTypes.exe' failed. Dim y = Async Function() 1 ~~~~~~~~~~~~~~~~~~ BC31091: Import of type 'Task(Of )' from assembly or module 'MissingTaskTypes.exe' failed. Dim z = Async Function() ~~~~~~~~~~~~~~~~~ ]]></expected>) End Sub <Fact()> Public Sub IllegalAwait() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Module Program Sub Main() Await Task.Delay(1) End Sub Function Main2() As Integer Await Task.Delay(2) Return 1 End Function Dim x = Await Task.Delay(3) End Module ]]></file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected><![CDATA[ BC37058: 'Await' can only be used within an Async method. Consider marking this method with the 'Async' modifier and changing its return type to 'Task'. Await Task.Delay(1) ~~~~~ BC30800: Method arguments must be enclosed in parentheses. Await Task.Delay(1) ~~~~~~~~~~~~~ BC37057: 'Await' can only be used within an Async method. Consider marking this method with the 'Async' modifier and changing its return type to 'Task(Of Integer)'. Await Task.Delay(2) ~~~~~ BC30800: Method arguments must be enclosed in parentheses. Await Task.Delay(2) ~~~~~~~~~~~~~ BC36937: 'Await' can only be used when contained within a method or lambda expression marked with the 'Async' modifier. Dim x = Await Task.Delay(3) ~~~~~ BC30205: End of statement expected. Dim x = Await Task.Delay(3) ~~~~ ]]></expected>) End Sub <Fact()> Public Sub WRNID_UnobservedAwaitableExpression() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Imports System.Runtime.CompilerServices Namespace Windows.Foundation public interface IAsyncAction End Interface public interface IAsyncActionWithProgress(Of T) End Interface public interface IAsyncOperation(Of T) End Interface public interface IAsyncOperationWithProgress(Of T, S) End Interface End Namespace Class MyTask(Of T) Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T) With {.m_Task = Me} End Function End Class Structure MyTaskAwaiter(Of T) Implements INotifyCompletion Friend m_Task As MyTask(Of T) ReadOnly Property IsCompleted() As Boolean Get Throw New NotImplementedException() End Get End Property Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted Throw New NotImplementedException() End Sub Sub GetResult() Throw New NotImplementedException() End Sub End Structure Module Program Sub Main() End Sub Interface AsyncAction Inherits Windows.Foundation.IAsyncAction End Interface Function M1() As AsyncAction Return Nothing End Function Interface AsyncActionWithProgress Inherits Windows.Foundation.IAsyncActionWithProgress(Of Integer) End Interface Function M2() As AsyncActionWithProgress Return Nothing End Function Interface AsyncOperation Inherits Windows.Foundation.IAsyncOperation(Of Integer) End Interface Function M3() As AsyncOperation Return Nothing End Function Interface AsyncOperationWithProgress Inherits Windows.Foundation.IAsyncOperationWithProgress(Of Integer, Integer) End Interface Function M4() As AsyncOperationWithProgress Return Nothing End Function Async Sub M5() Await Task.Delay(1) End Sub Async Function M6() As Task Await Task.Delay(1) End Function Async Function M7() As Task(Of Integer) Await Task.Delay(1) Return 1 End Function Function M8() As Object Return Nothing End Function Function M9() As MyTask(Of Integer) Return Nothing End Function Function M10() As Task Return Nothing End Function Function M11() As Task(Of Integer) Return Nothing End Function Sub Test1() Call M1() M1() ' 1 Dim x1 = M1() Call M2() M2() ' 1 Dim x2 = M2() Call M3() M3() ' 1 Dim x3 = M3() Call M4() M4() ' 1 Dim x4 = M4() Call M5() M5() Call M6() M6() ' 1 Dim x6 = M6() Call M7() M7() ' 1 Dim x7 = M7() Call M8() M8() Dim x8 = M8() Call M9() M9() Dim x9 = M9() Call M10() M10() Dim x10 = M10() Call M11() M11() Dim x11 = M11() End Sub Async Sub Test2() Await Task.Delay(1) Call M1() M1() ' 2 Dim x1 = M1() Call M2() M2() ' 2 Dim x2 = M2() Call M3() M3() ' 2 Dim x3 = M3() Call M4() M4() ' 2 Dim x4 = M4() Call M5() M5() Call M6() M6() ' 2 Dim x6 = M6() Call M7() M7() ' 2 Dim x7 = M7() Call M8() M8() Dim x8 = M8() Call M9() M9() ' 2 Dim x9 = M9() Call M10() M10() ' 2 Dim x10 = M10() Call M11() M11() ' 2 Dim x11 = M11() End Sub Async Function Test3() As Task Await Task.Delay(1) Call M1() M1() ' 3 Dim x1 = M1() Call M2() M2() ' 3 Dim x2 = M2() Call M3() M3() ' 3 Dim x3 = M3() Call M4() M4() ' 3 Dim x4 = M4() Call M5() M5() Call M6() M6() ' 3 Dim x6 = M6() Call M7() M7() ' 3 Dim x7 = M7() Call M8() M8() Dim x8 = M8() Call M9() M9() ' 3 Dim x9 = M9() Call M10() M10() ' 3 Dim x10 = M10() Call M11() M11() ' 3 Dim x11 = M11() End Function End Module ]]></file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected><![CDATA[ BC42358: Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the Await operator to the result of the call. M1() ' 1 ~~~~ BC42358: Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the Await operator to the result of the call. M2() ' 1 ~~~~ BC42358: Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the Await operator to the result of the call. M3() ' 1 ~~~~ BC42358: Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the Await operator to the result of the call. M4() ' 1 ~~~~ BC42358: Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the Await operator to the result of the call. M6() ' 1 ~~~~ BC42358: Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the Await operator to the result of the call. M7() ' 1 ~~~~ BC42358: Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the Await operator to the result of the call. M1() ' 2 ~~~~ BC42358: Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the Await operator to the result of the call. M2() ' 2 ~~~~ BC42358: Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the Await operator to the result of the call. M3() ' 2 ~~~~ BC42358: Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the Await operator to the result of the call. M4() ' 2 ~~~~ BC42358: Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the Await operator to the result of the call. M6() ' 2 ~~~~ BC42358: Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the Await operator to the result of the call. M7() ' 2 ~~~~ BC42358: Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the Await operator to the result of the call. M9() ' 2 ~~~~ BC42358: Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the Await operator to the result of the call. M10() ' 2 ~~~~~ BC42358: Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the Await operator to the result of the call. M11() ' 2 ~~~~~ BC42358: Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the Await operator to the result of the call. M1() ' 3 ~~~~ BC42358: Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the Await operator to the result of the call. M2() ' 3 ~~~~ BC42358: Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the Await operator to the result of the call. M3() ' 3 ~~~~ BC42358: Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the Await operator to the result of the call. M4() ' 3 ~~~~ BC42358: Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the Await operator to the result of the call. M6() ' 3 ~~~~ BC42358: Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the Await operator to the result of the call. M7() ' 3 ~~~~ BC42358: Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the Await operator to the result of the call. M9() ' 3 ~~~~ BC42358: Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the Await operator to the result of the call. M10() ' 3 ~~~~~ BC42358: Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the Await operator to the result of the call. M11() ' 3 ~~~~~ ]]></expected>) End Sub <Fact()> Public Sub ERRID_LoopControlMustNotAwait() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Module Program Sub Main() End Sub Dim array() As Integer Async Sub Test1() For x As Integer = Test3(Await Test2()) To 10 Next For array(Test3(Await Test2())) = 0 To 10 ' 1 Next For Each array(Test3(Await Test2())) In {1, 2, 3} ' 1 Next For Each array(Test4(Async Function() Await Test2() End Function)) In {1, 2, 3} ' 1 Next End Sub Async Function Test2() As Task(Of Integer) For y As Integer = Test3(Await Test2()) To 10 Next For array(Test3(Await Test2())) = 0 To 10 ' 2 Next For Each array(Test3(Await Test2())) In {1, 2, 3} ' 2 Next For Each array(Test4(Async Function() Await Test2() End Function)) In {1, 2, 3} ' 2 Next Return 2 End Function Function Test3(x As Integer) As Integer Return x End Function Function Test4(x As Func(Of Task)) As Integer Return 0 End Function End Module ]]></file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected><![CDATA[ BC37060: Loop control variable cannot include an 'Await'. For array(Test3(Await Test2())) = 0 To 10 ' 1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ BC37060: Loop control variable cannot include an 'Await'. For Each array(Test3(Await Test2())) In {1, 2, 3} ' 1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ BC37060: Loop control variable cannot include an 'Await'. For array(Test3(Await Test2())) = 0 To 10 ' 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ BC37060: Loop control variable cannot include an 'Await'. For Each array(Test3(Await Test2())) In {1, 2, 3} ' 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]]></expected>) End Sub <Fact()> Public Sub ERRID_BadStaticInitializerInResumable() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Module Program Sub Main() End Sub Async Sub Test1() Await Task.Delay(1) Static x As Integer x = 0 Static y As Integer = 0 Static a, b As Integer a = 0 b = 1 Static c As New Integer() Static d, e As New Integer() End Sub Async Function Test2() As Task(Of Integer) Await Task.Delay(1) Static u As Integer u = 0 Static v As Integer = 0 Static f, g As Integer f = 0 g = 1 Static h As New Integer() Static i, j As New Integer() Return 2 End Function End Module ]]></file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected><![CDATA[ BC36955: Static variables cannot appear inside Async or Iterator methods. Static x As Integer ~ BC36955: Static variables cannot appear inside Async or Iterator methods. Static y As Integer = 0 ~ BC36955: Static variables cannot appear inside Async or Iterator methods. Static a, b As Integer ~ BC36955: Static variables cannot appear inside Async or Iterator methods. Static a, b As Integer ~ BC36955: Static variables cannot appear inside Async or Iterator methods. Static c As New Integer() ~ BC36955: Static variables cannot appear inside Async or Iterator methods. Static d, e As New Integer() ~ BC36955: Static variables cannot appear inside Async or Iterator methods. Static d, e As New Integer() ~ BC36955: Static variables cannot appear inside Async or Iterator methods. Static u As Integer ~ BC36955: Static variables cannot appear inside Async or Iterator methods. Static v As Integer = 0 ~ BC36955: Static variables cannot appear inside Async or Iterator methods. Static f, g As Integer ~ BC36955: Static variables cannot appear inside Async or Iterator methods. Static f, g As Integer ~ BC36955: Static variables cannot appear inside Async or Iterator methods. Static h As New Integer() ~ BC36955: Static variables cannot appear inside Async or Iterator methods. Static i, j As New Integer() ~ BC36955: Static variables cannot appear inside Async or Iterator methods. Static i, j As New Integer() ~ ]]></expected>) End Sub <Fact()> Public Sub ERRID_RestrictedResumableType1() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Module Program Delegate Sub D1(x As ArgIterator) Delegate Sub D2(ByRef x As ArgIterator) Delegate Sub D3(ByRef x As ArgIterator()) Delegate Sub D4(x As ArgIterator()) Sub Main() Dim x = Async Sub(a As ArgIterator) Await Task.Delay(1) End Sub Dim y = Async Sub(ByRef a As ArgIterator) Await Task.Delay(1) End Sub Dim z = Async Sub(ByRef a As ArgIterator()) Await Task.Delay(1) End Sub Dim u = Async Sub(a As ArgIterator()) Await Task.Delay(1) End Sub Dim x1 As D1 = Async Sub(a As ArgIterator) Await Task.Delay(1) End Sub Dim y1 As D2 = Async Sub(ByRef a As ArgIterator) Await Task.Delay(1) End Sub Dim z1 As D3 = Async Sub(ByRef a As ArgIterator()) Await Task.Delay(1) End Sub Dim u1 As D4 = Async Sub(a As ArgIterator()) Await Task.Delay(1) End Sub Dim x2 As D1 = Async Sub(a) Await Task.Delay(1) End Sub Dim y2 As D2 = Async Sub(ByRef a) Await Task.Delay(1) End Sub Dim z2 As D3 = Async Sub(ByRef a) Await Task.Delay(1) End Sub Dim u2 As D4 = Async Sub(a) Await Task.Delay(1) End Sub End Sub Async Sub Test1(x As ArgIterator) Await Task.Delay(1) End Sub Async Sub Test2(ByRef x As ArgIterator) Await Task.Delay(1) End Sub Async Sub Test3(x As ArgIterator()) Await Task.Delay(1) End Sub Async Sub Test4(ByRef x As ArgIterator()) Await Task.Delay(1) End Sub End Module ]]></file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) 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. Delegate Sub D2(ByRef x 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. Delegate Sub D3(ByRef x 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. Delegate Sub D4(x 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 x = Async Sub(a As ArgIterator) ~~~~~~~~~~~ BC36932: 'ArgIterator' cannot be used as a parameter type for an Iterator or Async method. Dim x = Async Sub(a As ArgIterator) ~~~~~~~~~~~ BC36926: Async methods cannot have ByRef parameters. Dim y = Async Sub(ByRef a 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 y = Async Sub(ByRef a As ArgIterator) ~~~~~~~~~~~ BC36926: Async methods cannot have ByRef parameters. Dim z = Async Sub(ByRef a 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 u = Async Sub(a As ArgIterator()) ~~~~~~~~~~~~~ BC36932: 'ArgIterator' cannot be used as a parameter type for an Iterator or Async method. Dim x1 As D1 = Async Sub(a As ArgIterator) ~~~~~~~~~~~ BC36926: Async methods cannot have ByRef parameters. Dim y1 As D2 = Async Sub(ByRef a As ArgIterator) ~~~~~~~~~~~~~~~~~~~~~~ BC36926: Async methods cannot have ByRef parameters. Dim z1 As D3 = Async Sub(ByRef a 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 u1 As D4 = Async Sub(a As ArgIterator()) ~~~~~~~~~~~~~ BC36932: 'ArgIterator' cannot be used as a parameter type for an Iterator or Async method. Dim x2 As D1 = Async Sub(a) ~ BC36926: Async methods cannot have ByRef parameters. Dim y2 As D2 = Async Sub(ByRef a) ~~~~~~~ BC36926: Async methods cannot have ByRef parameters. Dim z2 As D3 = Async Sub(ByRef a) ~~~~~~~ BC36932: 'ArgIterator' cannot be used as a parameter type for an Iterator or Async method. Async Sub Test1(x As ArgIterator) ~~~~~~~~~~~ BC36926: Async methods cannot have ByRef parameters. Async Sub Test2(ByRef x 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. Async Sub Test3(x As ArgIterator()) ~~~~~~~~~~~~~ BC36926: Async methods cannot have ByRef parameters. Async Sub Test4(ByRef x As ArgIterator()) ~~~~~~~~~~~~~~~~~~~~~~~~ ]]></expected>) End Sub <Fact()> Public Sub ERRID_ConstructorAsync_and_ERRID_PartialMethodsMustNotBeAsync1() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Module Program Sub Main() End Sub Class Test Async Sub New() End Sub Shared Async Sub New() End Sub Partial Private Async Sub Part() End Sub Private Async Sub Part() Await Task.Delay(1) End Sub End Class End Module ]]></file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected><![CDATA[ BC36950: Constructor must not have the 'Async' modifier. Async Sub New() ~~~~~ BC36950: Constructor must not have the 'Async' modifier. Shared Async Sub New() ~~~~~ BC36935: 'Part' cannot be declared 'Partial' because it has the 'Async' modifier. Partial Private Async Sub Part() ~~~~ ]]></expected>) End Sub <Fact()> Public Sub ERRID_ResumablesCannotContainOnError() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Module Program Sub Main() End Sub Async Sub Test1() Await Task.Delay(1) On Error GoTo 0 ' 1 Resume Next ' 1 End Sub Iterator Function Test2() As System.Collections.Generic.IEnumerable(Of Integer) On Error GoTo 0 ' 2 Resume Next ' 2 End Function End Module ]]></file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected><![CDATA[ BC36956: 'On Error' and 'Resume' cannot appear inside async or iterator methods. On Error GoTo 0 ' 1 ~~~~~~~~~~~~~~~ BC36956: 'On Error' and 'Resume' cannot appear inside async or iterator methods. Resume Next ' 1 ~~~~~~~~~~~ BC36956: 'On Error' and 'Resume' cannot appear inside async or iterator methods. On Error GoTo 0 ' 2 ~~~~~~~~~~~~~~~ BC36956: 'On Error' and 'Resume' cannot appear inside async or iterator methods. Resume Next ' 2 ~~~~~~~~~~~ ]]></expected>) End Sub <Fact()> Public Sub ERRID_ResumableLambdaInExpressionTree() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Imports System.Linq.Expressions Module Program Sub Main() Dim x As Expression(Of Action) = Async Sub() Await Task.Delay(1) Dim y As Expression(Of Func(Of System.Collections.Generic.IEnumerable(Of Integer))) = Iterator Function() End Function End Sub End Module ]]></file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected><![CDATA[ BC37050: Lambdas with the 'Async' or 'Iterator' modifiers cannot be converted to expression trees. Dim x As Expression(Of Action) = Async Sub() Await Task.Delay(1) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ BC37050: Lambdas with the 'Async' or 'Iterator' modifiers cannot be converted to expression trees. Dim y As Expression(Of Func(Of System.Collections.Generic.IEnumerable(Of Integer))) = Iterator Function() ~~~~~~~~~~~~~~~~~~~~ ]]></expected>) End Sub <Fact()> Public Sub ERRID_CannotLiftRestrictedTypeResumable1() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Module Program Sub Main() End Sub Async Sub Test1() Await Task.Delay(1) Dim a1 As ArgIterator Dim b1 As ArgIterator = Nothing Dim c1 As ArgIterator, d1 As ArgIterator = Nothing Dim e1 As New ArgIterator(Nothing) Dim f1, g1 As New ArgIterator(Nothing) Dim h1 = New ArgIterator() a1=Nothing c1=Nothing End Sub Iterator Function Test2() As System.Collections.Generic.IEnumerable(Of Integer) Dim a2 As ArgIterator Dim b2 As ArgIterator = Nothing Dim c2 As ArgIterator, d2 As ArgIterator = Nothing Dim e2 As New ArgIterator(Nothing) Dim f2, g2 As New ArgIterator(Nothing) Dim h2 = New ArgIterator() a2=Nothing c2=Nothing End Function End Module ]]></file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected><![CDATA[ BC37052: Variable of restricted type 'ArgIterator' cannot be declared in an Async or Iterator method. Dim a1 As ArgIterator ~~~~~~~~~~~ BC37052: Variable of restricted type 'ArgIterator' cannot be declared in an Async or Iterator method. Dim b1 As ArgIterator = Nothing ~~~~~~~~~~~ BC37052: Variable of restricted type 'ArgIterator' cannot be declared in an Async or Iterator method. Dim c1 As ArgIterator, d1 As ArgIterator = Nothing ~~~~~~~~~~~ BC37052: Variable of restricted type 'ArgIterator' cannot be declared in an Async or Iterator method. Dim c1 As ArgIterator, d1 As ArgIterator = Nothing ~~~~~~~~~~~ BC37052: Variable of restricted type 'ArgIterator' cannot be declared in an Async or Iterator method. Dim e1 As New ArgIterator(Nothing) ~~~~~~~~~~~ BC37052: Variable of restricted type 'ArgIterator' cannot be declared in an Async or Iterator method. Dim f1, g1 As New ArgIterator(Nothing) ~~~~~~~~~~~ BC37052: Variable of restricted type 'ArgIterator' cannot be declared in an Async or Iterator method. Dim h1 = New ArgIterator() ~~~~~~~~~~~~~~~~~~~ BC37052: Variable of restricted type 'ArgIterator' cannot be declared in an Async or Iterator method. Dim a2 As ArgIterator ~~~~~~~~~~~ BC37052: Variable of restricted type 'ArgIterator' cannot be declared in an Async or Iterator method. Dim b2 As ArgIterator = Nothing ~~~~~~~~~~~ BC37052: Variable of restricted type 'ArgIterator' cannot be declared in an Async or Iterator method. Dim c2 As ArgIterator, d2 As ArgIterator = Nothing ~~~~~~~~~~~ BC37052: Variable of restricted type 'ArgIterator' cannot be declared in an Async or Iterator method. Dim c2 As ArgIterator, d2 As ArgIterator = Nothing ~~~~~~~~~~~ BC37052: Variable of restricted type 'ArgIterator' cannot be declared in an Async or Iterator method. Dim e2 As New ArgIterator(Nothing) ~~~~~~~~~~~ BC37052: Variable of restricted type 'ArgIterator' cannot be declared in an Async or Iterator method. Dim f2, g2 As New ArgIterator(Nothing) ~~~~~~~~~~~ BC37052: Variable of restricted type 'ArgIterator' cannot be declared in an Async or Iterator method. Dim h2 = New ArgIterator() ~~~~~~~~~~~~~~~~~~~ ]]></expected>) End Sub <Fact()> Public Sub ERRID_BadAwaitInTryHandler() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Module Program Sub Main() Dim x = Async Sub() Try Await Test2() ' Try 1 Catch ex As Exception When Await Test2() > 1 ' Filter 1 Catch Await Test2() ' Catch 1 Finally Await Test2() ' Finally 1 End Try SyncLock New Lock(Await Test2()) ' SyncLock 1 Await Test2() ' SyncLock 1 End SyncLock End Sub End Sub Async Sub Test1() Try Await Test2() ' Try 2 Catch ex As Exception When Await Test2() > 1 ' Filter 2 Catch Await Test2() ' Catch 2 Finally Await Test2() ' Finally 2 End Try SyncLock New Lock(Await Test2()) ' SyncLock 2 Await Test2() ' SyncLock 2 End SyncLock End Sub Async Function Test2() As Task(Of Integer) Await Task.Delay(1) Return 1 End Function Class Lock Sub New(x As Integer) End Sub End Class End Module ]]></file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected><![CDATA[ BC36943: 'Await' cannot be used inside a 'Catch' statement, a 'Finally' statement, or a 'SyncLock' statement. Catch ex As Exception When Await Test2() > 1 ' Filter 1 ~~~~~~~~~~~~~ BC36943: 'Await' cannot be used inside a 'Catch' statement, a 'Finally' statement, or a 'SyncLock' statement. Await Test2() ' Catch 1 ~~~~~~~~~~~~~ BC36943: 'Await' cannot be used inside a 'Catch' statement, a 'Finally' statement, or a 'SyncLock' statement. Await Test2() ' Finally 1 ~~~~~~~~~~~~~ BC36943: 'Await' cannot be used inside a 'Catch' statement, a 'Finally' statement, or a 'SyncLock' statement. SyncLock New Lock(Await Test2()) ' SyncLock 1 ~~~~~~~~~~~~~ BC36943: 'Await' cannot be used inside a 'Catch' statement, a 'Finally' statement, or a 'SyncLock' statement. Await Test2() ' SyncLock 1 ~~~~~~~~~~~~~ BC36943: 'Await' cannot be used inside a 'Catch' statement, a 'Finally' statement, or a 'SyncLock' statement. Catch ex As Exception When Await Test2() > 1 ' Filter 2 ~~~~~~~~~~~~~ BC36943: 'Await' cannot be used inside a 'Catch' statement, a 'Finally' statement, or a 'SyncLock' statement. Await Test2() ' Catch 2 ~~~~~~~~~~~~~ BC36943: 'Await' cannot be used inside a 'Catch' statement, a 'Finally' statement, or a 'SyncLock' statement. Await Test2() ' Finally 2 ~~~~~~~~~~~~~ BC36943: 'Await' cannot be used inside a 'Catch' statement, a 'Finally' statement, or a 'SyncLock' statement. SyncLock New Lock(Await Test2()) ' SyncLock 2 ~~~~~~~~~~~~~ BC36943: 'Await' cannot be used inside a 'Catch' statement, a 'Finally' statement, or a 'SyncLock' statement. Await Test2() ' SyncLock 2 ~~~~~~~~~~~~~ ]]></expected>) End Sub <Fact()> Public Sub WRNID_AsyncLacksAwaits() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Module Program Sub Main() Dim x = Async Sub() End Sub End Sub Async Sub Test1() End Sub Async Function Test2() As Task(Of Integer) Return 1 End Function End Module ]]></file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected><![CDATA[ BC42356: This async method lacks 'Await' operators and so will run synchronously. Consider using the 'Await' operator to await non-blocking API calls, or 'Await Task.Run(...)' to do CPU-bound work on a background thread. Dim x = Async Sub() ~~~ BC42356: This async method lacks 'Await' operators and so will run synchronously. Consider using the 'Await' operator to await non-blocking API calls, or 'Await Task.Run(...)' to do CPU-bound work on a background thread. Async Sub Test1() ~~~~~ BC42356: This async method lacks 'Await' operators and so will run synchronously. Consider using the 'Await' operator to await non-blocking API calls, or 'Await Task.Run(...)' to do CPU-bound work on a background thread. Async Function Test2() As Task(Of Integer) ~~~~~ ]]></expected>) End Sub <Fact()> Public Sub WRNID_UnobservedAwaitableDelegate() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Module Program Sub Main() Dim x As Action x = AddressOf Test1 x = AddressOf Test2 x = AddressOf Test3 x = AddressOf Test4 x = AddressOf Test5 x = New Action(AddressOf Test2) x = CType(AddressOf Test2, Action) x = DirectCast(AddressOf Test2, Action) x = TryCast(AddressOf Test2, Action) x = Async Sub() Await Task.Delay(1) End Sub x = Async Function() Await Task.Delay(1) Return 1 End Function x = Async Function() As Task(Of Integer) Await Task.Delay(1) Return 1 End Function x = Async Function() Await Task.Delay(1) End Function x = Async Function() As Task Await Task.Delay(1) End Function x = New Action(Async Function() Await Task.Delay(1) End Function) x = CType(Async Function() Await Task.Delay(1) End Function, Action) x = DirectCast(Async Function() Await Task.Delay(1) End Function, Action) x = TryCast(Async Function() Await Task.Delay(1) End Function, Action) x = Function() As Task(Of Integer) Return Nothing End Function x = Function() As Task Return Nothing End Function Dim y = Async Function() Await Task.Delay(1) End Function x = y End Sub Async Sub Test1() Handles z.y Await Task.Delay(1) End Sub Async Function Test2() As Task(Of Integer) Handles z.y Await Task.Delay(1) Return 1 End Function Async Function Test3() As Task Handles z.y Await Task.Delay(1) End Function WithEvents z As CWithEvents Class CWithEvents Public Event y As Action End Class Function Test4() As Task(Of Integer) Handles z.y Return Nothing End Function Function Test5() As Task Handles z.y Return Nothing End Function End Module ]]></file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected><![CDATA[ BC42359: The Task returned from this Async Function will be dropped, and any exceptions in it ignored. Consider changing it to an Async Sub so its exceptions are propagated. x = AddressOf Test2 ~~~~~~~~~~~~~~~ BC42359: The Task returned from this Async Function will be dropped, and any exceptions in it ignored. Consider changing it to an Async Sub so its exceptions are propagated. x = AddressOf Test3 ~~~~~~~~~~~~~~~ BC42359: The Task returned from this Async Function will be dropped, and any exceptions in it ignored. Consider changing it to an Async Sub so its exceptions are propagated. x = Async Function() ~~~~~~~~~~~~~~~~~ BC42359: The Task returned from this Async Function will be dropped, and any exceptions in it ignored. Consider changing it to an Async Sub so its exceptions are propagated. x = Async Function() As Task(Of Integer) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ BC42359: The Task returned from this Async Function will be dropped, and any exceptions in it ignored. Consider changing it to an Async Sub so its exceptions are propagated. x = Async Function() ~~~~~~~~~~~~~~~~~ BC42359: The Task returned from this Async Function will be dropped, and any exceptions in it ignored. Consider changing it to an Async Sub so its exceptions are propagated. x = Async Function() As Task ~~~~~~~~~~~~~~~~~~~~~~~~~ BC42359: The Task returned from this Async Function will be dropped, and any exceptions in it ignored. Consider changing it to an Async Sub so its exceptions are propagated. Async Function Test2() As Task(Of Integer) Handles z.y ~~~ BC42359: The Task returned from this Async Function will be dropped, and any exceptions in it ignored. Consider changing it to an Async Sub so its exceptions are propagated. Async Function Test3() As Task Handles z.y ~~~ ]]></expected>) End Sub <Fact()> Public Sub ERRID_SecurityCriticalAsyncInClassOrStruct_1() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks <Security.SecurityCritical()> Module Program Sub Main() End Sub Async Sub Test1() Await Task.Delay(1) End Sub Iterator Function Test2() As Collections.Generic.IEnumerable(Of Integer) End Function Class C1 Async Sub Test3() Await Task.Delay(1) End Sub Iterator Function Test4() As Collections.Generic.IEnumerable(Of Integer) End Function End Class End Module ]]></file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected><![CDATA[ BC31005: Async and Iterator methods are not allowed in a [Class|Structure|Interface|Module] that has the 'SecurityCritical' or 'SecuritySafeCritical' attribute. Async Sub Test1() ~~~~~ BC31005: Async and Iterator methods are not allowed in a [Class|Structure|Interface|Module] that has the 'SecurityCritical' or 'SecuritySafeCritical' attribute. Iterator Function Test2() As Collections.Generic.IEnumerable(Of Integer) ~~~~~ BC31005: Async and Iterator methods are not allowed in a [Class|Structure|Interface|Module] that has the 'SecurityCritical' or 'SecuritySafeCritical' attribute. Async Sub Test3() ~~~~~ BC31005: Async and Iterator methods are not allowed in a [Class|Structure|Interface|Module] that has the 'SecurityCritical' or 'SecuritySafeCritical' attribute. Iterator Function Test4() As Collections.Generic.IEnumerable(Of Integer) ~~~~~ ]]></expected>) End Sub <Fact()> Public Sub ERRID_SecurityCriticalAsyncInClassOrStruct_2() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Module Program Sub Main() End Sub End Module <Security.SecuritySafeCritical()> Class C2 Private Async Sub Test5() Await Task.Delay(1) End Sub Partial Private Async Sub Test5() End Sub Iterator Function Test6() As Collections.Generic.IEnumerable(Of Integer) End Function End Class ]]></file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected><![CDATA[ BC31005: Async and Iterator methods are not allowed in a [Class|Structure|Interface|Module] that has the 'SecurityCritical' or 'SecuritySafeCritical' attribute. Private Async Sub Test5() ~~~~~ BC36935: 'Test5' cannot be declared 'Partial' because it has the 'Async' modifier. Partial Private Async Sub Test5() ~~~~~ BC31005: Async and Iterator methods are not allowed in a [Class|Structure|Interface|Module] that has the 'SecurityCritical' or 'SecuritySafeCritical' attribute. Iterator Function Test6() As Collections.Generic.IEnumerable(Of Integer) ~~~~~ ]]></expected>) End Sub <Fact()> Public Sub ERRID_SecurityCriticalAsync() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Module Program Sub Main() End Sub <Security.SecurityCritical()> ' 1 Private Async Sub Test1() Await Task.Delay(1) End Sub Partial Private Async Sub Test1() End Sub <Security.SecuritySafeCritical()> ' 2 Iterator Function Test2() As Collections.Generic.IEnumerable(Of Integer) End Function Private Async Sub Test3() Await Task.Delay(1) End Sub <Security.SecurityCritical()> ' 3 Partial Private Sub Test3() End Sub <Security.SecurityCritical()> ' 4 Partial Private Async Sub Test4() End Sub End Module ]]></file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected><![CDATA[ BC31006: Security attribute 'SecurityCritical' cannot be applied to an Async or Iterator method. <Security.SecurityCritical()> ' 1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ BC36935: 'Test1' cannot be declared 'Partial' because it has the 'Async' modifier. Partial Private Async Sub Test1() ~~~~~ BC31006: Security attribute 'SecuritySafeCritical' cannot be applied to an Async or Iterator method. <Security.SecuritySafeCritical()> ' 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ BC31006: Security attribute 'SecurityCritical' cannot be applied to an Async or Iterator method. <Security.SecurityCritical()> ' 3 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ BC36935: 'Test4' cannot be declared 'Partial' because it has the 'Async' modifier. Partial Private Async Sub Test4() ~~~~~ ]]></expected>) End Sub <Fact()> Public Sub ERRID_DllImportOnResumableMethod() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Imports System.Runtime.InteropServices Module Program Sub Main() End Sub <DllImport("Test1")> Private Async Sub Test1() Await Task.Delay(1) End Sub Partial Private Async Sub Test1() End Sub <DllImport("Test2")> Iterator Function Test2() As Collections.Generic.IEnumerable(Of Integer) End Function Private Async Sub Test3() Await Task.Delay(1) End Sub <DllImport("Test3")> Partial Private Sub Test3() End Sub <DllImport("Test4")> Partial Private Async Sub Test4() End Sub <DllImport("Test5")> Partial Private Sub Test5() End Sub Private Sub Test5() Return End Sub <DllImport("Test6")> Partial Private Sub Test6() End Sub Private Sub Test6() End Sub <DllImport("Test7")> Partial Private Sub Test7() End Sub Private Async Sub Test7() End Sub End Module ]]></file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected><![CDATA[ BC37051: 'System.Runtime.InteropServices.DllImportAttribute' cannot be applied to an Async or Iterator method. Private Async Sub Test1() ~~~~~ BC36935: 'Test1' cannot be declared 'Partial' because it has the 'Async' modifier. Partial Private Async Sub Test1() ~~~~~ BC37051: 'System.Runtime.InteropServices.DllImportAttribute' cannot be applied to an Async or Iterator method. Iterator Function Test2() As Collections.Generic.IEnumerable(Of Integer) ~~~~~ BC37051: 'System.Runtime.InteropServices.DllImportAttribute' cannot be applied to an Async or Iterator method. Private Async Sub Test3() ~~~~~ BC36935: 'Test4' cannot be declared 'Partial' because it has the 'Async' modifier. Partial Private Async Sub Test4() ~~~~~ BC31522: 'System.Runtime.InteropServices.DllImportAttribute' cannot be applied to a Sub, Function, or Operator with a non-empty body. <DllImport("Test5")> ~~~~~~~~~ BC37051: 'System.Runtime.InteropServices.DllImportAttribute' cannot be applied to an Async or Iterator method. Private Async Sub Test7() ~~~~~ BC42356: This async method lacks 'Await' operators and so will run synchronously. Consider using the 'Await' operator to await non-blocking API calls, or 'Await Task.Run(...)' to do CPU-bound work on a background thread. Private Async Sub Test7() ~~~~~ ]]></expected>) End Sub <Fact()> Public Sub ERRID_SynchronizedAsyncMethod() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Imports System.Runtime.InteropServices Imports System.Runtime.CompilerServices Module Program Sub Main() End Sub <MethodImpl(MethodImplOptions.Synchronized)> Private Async Sub Test1() Await Task.Delay(1) End Sub Partial Private Async Sub Test1() End Sub <MethodImpl(MethodImplOptions.Synchronized)> Iterator Function Test2() As Collections.Generic.IEnumerable(Of Integer) End Function Private Async Sub Test3() Await Task.Delay(1) End Sub <MethodImpl(MethodImplOptions.Synchronized)> Partial Private Sub Test3() End Sub <MethodImpl(MethodImplOptions.Synchronized)> Partial Private Async Sub Test4() End Sub End Module ]]></file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected><![CDATA[ BC37054: 'MethodImplOptions.Synchronized' cannot be applied to an Async method. Private Async Sub Test1() ~~~~~ BC36935: 'Test1' cannot be declared 'Partial' because it has the 'Async' modifier. Partial Private Async Sub Test1() ~~~~~ BC37054: 'MethodImplOptions.Synchronized' cannot be applied to an Async method. Private Async Sub Test3() ~~~~~ BC36935: 'Test4' cannot be declared 'Partial' because it has the 'Async' modifier. Partial Private Async Sub Test4() ~~~~~ ]]></expected>) End Sub <Fact()> Public Sub ERRID_AsyncSubMain() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Module Program Async Sub Main() 'Await Task.Delay(1) End Sub End Module ]]></file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected><![CDATA[ BC36934: The 'Main' method cannot be marked 'Async'. Async Sub Main() ~~~~ BC42356: This async method lacks 'Await' operators and so will run synchronously. Consider using the 'Await' operator to await non-blocking API calls, or 'Await Task.Run(...)' to do CPU-bound work on a background thread. Async Sub Main() ~~~~ ]]></expected>) End Sub <Fact()> Public Sub WRNID_AsyncSubCouldBeFunction_1() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Imports System.Runtime.CompilerServices Module Program Sub Main() End Sub End Module Module Program1 Sub Main1() ' 1 Task.Factory.StartNew(Async Sub() ' 1 Await Task.Delay(1) End Sub) Task.Factory.StartNew((Async Sub() ' 1 Await Task.Delay(1) End Sub)) ' 2 Task.Run(Async Sub() ' 2 Await Task.Delay(1) End Sub) End Sub End Module ]]></file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected><![CDATA[ BC42357: Some overloads here take an Async Function rather than an Async Sub. Consider either using an Async Function, or casting this Async Sub explicitly to the desired type. Task.Factory.StartNew(Async Sub() ' 1 ~~~~~~~~~~~ BC42357: Some overloads here take an Async Function rather than an Async Sub. Consider either using an Async Function, or casting this Async Sub explicitly to the desired type. Task.Factory.StartNew((Async Sub() ' 1 ~~~~~~~~~~~ BC42357: Some overloads here take an Async Function rather than an Async Sub. Consider either using an Async Function, or casting this Async Sub explicitly to the desired type. Task.Run(Async Sub() ' 2 ~~~~~~~~~~~ ]]></expected>) End Sub <Fact()> Public Sub WRNID_AsyncSubCouldBeFunction_2() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Imports System.Runtime.CompilerServices Module Program Sub Main() End Sub End Module Module Program2 Async Function f(ByVal i As Integer) As Task Dim j As Integer = 2 Await taskrun(Sub() Dim x = 5 Console.WriteLine(x + i + j) End Sub) ' 3 Await taskrun(Async Sub() ' 3 Dim x = 6 Await Task.Delay(1) End Sub) Await taskrun((Async Sub() ' 3 Dim x = 6 Await Task.Delay(1) End Sub)) Await taskrun(Async Function() Dim x = 7 Await Task.Delay(1) End Function) Await taskrun(Async Function() Dim x = 8 Await Task.Delay(1) End Function) End Function Async Function taskrun(ByVal f As Func(Of Task)) As Task Dim tt As Task(Of Task) = Task.Factory.StartNew(Of Task)(f) Dim t As Task = Await tt Await t End Function Async Function taskrun(ByVal f As Action) As task Dim t As Task = Task.Factory.StartNew(f) Await t End Function End Module ]]></file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected><![CDATA[ BC42357: Some overloads here take an Async Function rather than an Async Sub. Consider either using an Async Function, or casting this Async Sub explicitly to the desired type. Await taskrun(Async Sub() ' 3 ~~~~~~~~~~~ BC42357: Some overloads here take an Async Function rather than an Async Sub. Consider either using an Async Function, or casting this Async Sub explicitly to the desired type. Await taskrun((Async Sub() ' 3 ~~~~~~~~~~~ ]]></expected>) End Sub <Fact()> Public Sub WRNID_AsyncSubCouldBeFunction_3() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Imports System.Runtime.CompilerServices Module Program Sub Main() End Sub End Module Module Program3 Sub Main3() Dim t = Async Function() Await Task.Yield() Return "hello" End Function() TaskRun(Sub() Console.WriteLine("expected Action")) TaskRun(Sub() Console.WriteLine("expected Action") End Sub) ' 4 TaskRun(Async Sub() Await Task.Delay(1)) ' 4 ' 5 TaskRun(Async Sub() ' 5 Await Task.Delay(1) End Sub) TaskRun(Function() "expected Func<T>") TaskRun(Function() Return "expected Func<T>" End Function) TaskRun(Async Function() Console.WriteLine("expected Func<Task>") Await Task.Yield() End Function) TaskRun(Async Function() d(Await t, "expected Func<Task<T>>")) TaskRun(Async Function() Await Task.Yield() Return "expected Func<Task<T>>" End Function) End Sub Function d(Of T)(dummy As Object, x As T) As T Return x End Function Sub TaskRun(f As Action) Console.WriteLine("TaskRun: Action") f() Console.WriteLine() End Sub Sub TaskRun(f As Func(Of Task)) Console.WriteLine("TaskRun: Func<Task>") f().Wait() Console.WriteLine() End Sub Sub TaskRun(Of T)(f As Func(Of T)) Console.WriteLine("TaskRun: Func<T>") Console.WriteLine(f()) Console.WriteLine() End Sub Sub TaskRun(Of T)(f As Func(Of Task(Of T))) Console.WriteLine("TaskRun: Func<Task<T>>") Console.WriteLine(f().Result) Console.WriteLine() End Sub End Module ]]></file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected><![CDATA[ BC42357: Some overloads here take an Async Function rather than an Async Sub. Consider either using an Async Function, or casting this Async Sub explicitly to the desired type. TaskRun(Async Sub() Await Task.Delay(1)) ' 4 ~~~~~~~~~~~ BC42357: Some overloads here take an Async Function rather than an Async Sub. Consider either using an Async Function, or casting this Async Sub explicitly to the desired type. TaskRun(Async Sub() ' 5 ~~~~~~~~~~~ ]]></expected>) End Sub <Fact()> Public Sub WRNID_AsyncSubCouldBeFunction_4() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Imports System.Runtime.CompilerServices Module Program Sub Main() End Sub End Module Module Program4 Function f(x As action) As Integer Return 1 End Function Function f(Of T)(x As Func(Of T)) As Integer Return 2 End Function Sub h(x As Action) End Sub Sub h(x As Func(Of Task)) End Sub Sub Main4() ' 6 f(Async Sub() ' 6 Await Task.Yield() End Sub) ' 7 Console.WriteLine(f(Async Sub() ' 7 Await Task.Yield() End Sub)) ' 8 h(Async Sub() ' 8 Await Task.Yield() End Sub) Dim s = "" ' 9 s.gg(Async Sub() ' 9 Await Task.Yield() End Sub) End Sub <Extension()> Sub gg(this As String, x As Action) End Sub <Extension()> Sub gg(this As String, x As Func(Of Task)) End Sub End Module ]]></file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected><![CDATA[ BC42357: Some overloads here take an Async Function rather than an Async Sub. Consider either using an Async Function, or casting this Async Sub explicitly to the desired type. f(Async Sub() ' 6 ~~~~~~~~~~~ BC42357: Some overloads here take an Async Function rather than an Async Sub. Consider either using an Async Function, or casting this Async Sub explicitly to the desired type. Console.WriteLine(f(Async Sub() ' 7 ~~~~~~~~~~~ BC42357: Some overloads here take an Async Function rather than an Async Sub. Consider either using an Async Function, or casting this Async Sub explicitly to the desired type. h(Async Sub() ' 8 ~~~~~~~~~~~ BC42357: Some overloads here take an Async Function rather than an Async Sub. Consider either using an Async Function, or casting this Async Sub explicitly to the desired type. s.gg(Async Sub() ' 9 ~~~~~~~~~~~ ]]></expected>) End Sub <Fact()> Public Sub WRNID_AsyncSubCouldBeFunction_5() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Imports System.Runtime.CompilerServices Module Program Sub Main() End Sub End Module Module Program5 Async Function Test() As Task Await Task.Yield() ' 10 CandidateMethod(Async Sub() ' 10 Await Task.Yield() End Sub) ' 11 CandidateMethod(Async Sub() ' 11 Await Task.Yield() End Sub) ' 12 CandidateMethod(Async Sub() ' 12 Console.WriteLine("fReturningTaskAsyncLambdaWithAwait") Await Task.Yield() End Sub) ' 13 CandidateMethod(Async Sub(i As Object) ' 13 Console.WriteLine("fTakingIntReturningTask") Await Task.Yield() End Sub) End Function Sub CandidateMethod() Console.WriteLine("CandidateMethod()") End Sub Sub CandidateMethod(i As Integer) Console.WriteLine("CandidateMethod(integer) passed {0}", i) End Sub Sub CandidateMethod(d As Double) Console.WriteLine("CandidateMethod(double) passed {0}", d) End Sub Sub CandidateMethod(o As Object) Console.WriteLine("CandidateMethod(object) passed {0}", o) End Sub Sub CandidateMethod(d As System.Delegate) Console.WriteLine("CandidateMethod(System.Delegate) passed {0}", d) End Sub Sub CandidateMethod(a As action) a() Console.WriteLine("CandidateMethod(Action) passed {0}", a) End Sub Sub CandidateMethod(f As Func(Of Integer)) Console.WriteLine("CandidateMethod(Func(Of integer)) func returns {0}", f()) End Sub Sub CandidateMethod(f As Func(Of Double)) Console.WriteLine("CandidateMethod(Func(Of double)) func returns {0}", f()) End Sub Sub CandidateMethod(f As Func(Of Task)) f().Wait() Console.WriteLine("CandidateMethod(Func(Of Task)) passed {0}", f) End Sub Sub CandidateMethod(f As Func(Of Task(Of Integer))) Console.WriteLine("CandidateMethod(Func(Of Task(Of integer))) task returns {0}", f().Result) End Sub Sub CandidateMethod(f As Func(Of Task(Of Double))) Console.WriteLine("CandidateMethod(Func(Of Task(Of (Of double))) task returns {0}", f().Result) End Sub Sub CandidateMethod(f As Func(Of Integer, Task)) f(1).Wait() Console.WriteLine("CandidateMethod(Func(Of integer,Task)) passed {0}", f) End Sub Sub CandidateMethod(f As Func(Of Integer, Task(Of Integer))) Console.WriteLine("CandidateMethod(Func(Of integer,Task(Of integer))) task returns {0}", f(1).Result) End Sub Sub CandidateMethod(f As Func(Of Integer, Task(Of Double))) Console.WriteLine("CandidateMethod(Func(Of integer,Task(Of double))) task returns {0}", f(1).Result) End Sub Sub CandidateMethod(f As Func(Of Task(Of Object))) Console.WriteLine("CandidateMethod(f As Func(Of Task(Of object))) task returns {0}", f().Result) End Sub Sub CandidateMethod(f As Func(Of Task(Of String))) Console.WriteLine("CandidateMethod(f As Func(Of Task(Of sting))) task returns {0}", f().Result) End Sub Sub CandidateMethod(f As Func(Of Task(Of Integer?))) Console.WriteLine("CandidateMethod(f As Func(Of Task(Of integer?))) task returns {0}", f().Result) End Sub Sub CandidateMethod(f As Func(Of Task(Of Double?))) Console.WriteLine("CandidateMethod(f As Func(Of Task(Of double?))) task returns {0}", f().Result) End Sub End Module ]]></file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929, SystemCoreRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected><![CDATA[ BC42357: Some overloads here take an Async Function rather than an Async Sub. Consider either using an Async Function, or casting this Async Sub explicitly to the desired type. CandidateMethod(Async Sub() ' 10 ~~~~~~~~~~~ BC42357: Some overloads here take an Async Function rather than an Async Sub. Consider either using an Async Function, or casting this Async Sub explicitly to the desired type. CandidateMethod(Async Sub() ' 11 ~~~~~~~~~~~ BC42357: Some overloads here take an Async Function rather than an Async Sub. Consider either using an Async Function, or casting this Async Sub explicitly to the desired type. CandidateMethod(Async Sub() ' 12 ~~~~~~~~~~~ BC42357: Some overloads here take an Async Function rather than an Async Sub. Consider either using an Async Function, or casting this Async Sub explicitly to the desired type. CandidateMethod(Async Sub(i As Object) ' 13 ~~~~~~~~~~~~~~~~~~~~~~ ]]></expected>) End Sub <Fact(), WorkItem(547087, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/547087")> Public Sub Bug17912_1() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Module Module1 Sub Main(args As String()) End Sub Async Function Test0() As Task Dim x as Await Dim y As [Await] Await Task.Delay(1) End Function Async Function await() As Task Await Task.Delay(1) End Function Async Sub Test1(await As Integer) Await Task.Delay(1) End Sub Async Function Test2(x As Await) As Task Await Task.Delay(1) End Function Async Function Test3() As Await Await Task.Delay(1) End Function End Module Class Await End Class ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected> BC42024: Unused local variable: 'x'. Dim x as Await ~ BC30183: Keyword is not valid as an identifier. Dim x as Await ~~~~~ BC42024: Unused local variable: 'y'. Dim y As [Await] ~ BC30183: Keyword is not valid as an identifier. Async Function await() As Task ~~~~~ BC30183: Keyword is not valid as an identifier. Async Sub Test1(await As Integer) ~~~~~ BC30183: Keyword is not valid as an identifier. Async Function Test2(x As Await) As Task ~~~~~ BC30183: Keyword is not valid as an identifier. Async Function Test3() As Await ~~~~~ BC36945: The 'Async' modifier can only be used on Subs, or on Functions that return Task or Task(Of T). Async Function Test3() As Await ~~~~~ BC42105: Function 'Test3' 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 ~~~~~~~~~~~~ </expected>) End Sub <Fact(), WorkItem(547087, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/547087")> Public Sub Bug17912_2() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Class Await End Class Module Module2 Sub Main(args As String()) End Sub Async Function [await]() As Task Await Task.Delay(1) End Function Async Sub Test1([await] As Integer) Await Task.Delay(1) End Sub Async Function Test2(x As [Await]) As Task Await Task.Delay(1) End Function Async Function Test3() As [Await] Await Task.Delay(1) End Function End Module ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected> BC36945: The 'Async' modifier can only be used on Subs, or on Functions that return Task or Task(Of T). Async Function Test3() As [Await] ~~~~~~~ BC42105: Function 'Test3' 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 ~~~~~~~~~~~~ </expected>) End Sub <Fact(), WorkItem(547087, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/547087")> Public Sub Bug17912_3() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Module Module1 Sub Main(args As String()) Dim test0 = Async Function() As Task Dim x As Await Dim y As [Await] Await Task.Delay(1) End Function Dim test1 = Async Sub (await As Integer) Await Task.Delay(1) End Sub Dim test2 = Async Function (x As Await) As Task Await Task.Delay(1) End Function Dim test3 = Async Function() As Await Await Task.Delay(1) End Function ' 1 Dim test4 = Async Sub (await As Integer) Await Task.Delay(1) Dim test5 = Async Sub (await As Integer) Await GetTask() Dim test11 = Async Sub([await] As Integer) Await Task.Delay(1) End Sub Dim test21 = Async Function(x As [Await]) As Task Await Task.Delay(1) End Function Dim test31 = Async Function() As Task(Of [Await]) Await Task.Delay(1) End Function ' 2 Dim test41 = Async Sub([await] As Integer) Await Task.Delay(1) Dim test51 = Async Sub([await] As Integer) Await GetTask() End Sub Function GetTask() As Task(Of Integer) Return Nothing End Function End Module Class Await End Class ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected><![CDATA[ BC42024: Unused local variable: 'x'. Dim x As Await ~ BC30183: Keyword is not valid as an identifier. Dim x As Await ~~~~~ BC42024: Unused local variable: 'y'. Dim y As [Await] ~ BC30183: Keyword is not valid as an identifier. Dim test1 = Async Sub (await As Integer) ~~~~~ BC30183: Keyword is not valid as an identifier. Dim test2 = Async Function (x As Await) As Task ~~~~~ BC30183: Keyword is not valid as an identifier. Dim test3 = Async Function() As Await ~~~~~ BC36945: The 'Async' modifier can only be used on Subs, or on Functions that return Task or Task(Of T). Dim test3 = Async Function() As Await ~~~~~ 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 ' 1 ~~~~~~~~~~~~ BC30183: Keyword is not valid as an identifier. Dim test4 = Async Sub (await As Integer) Await Task.Delay(1) ~~~~~ BC30183: Keyword is not valid as an identifier. Dim test5 = Async Sub (await As Integer) Await GetTask() ~~~~~ 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 ~~~~~~~~~~~~ ]]></expected>) End Sub <Fact(), WorkItem(568948, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/568948")> Public Sub Bug568948() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System.Collections.Generic Imports System.Linq Imports System.Threading.Tasks Public Module Module1 Public Sub Main() goo() End Sub Public Async Sub Goo() Dim AwaitableLambda1 = Async Function() Await Task.Yield Return New List(Of Test) From {New Test With {.Async = "test2", .Await = 2}, New Test With {.Async = "test3", .Await = 3}} End Function Dim Query = From x2 In Await AwaitableLambda1() Select New With {.async = x2, .b = Function(Await) Return Await.Await + 1 End Function.Invoke(x2)} 'ANOTHER EXAMPLE FAILING WITH SAME ISSUE.... ' ' Dim AwaitableLambda1 = Async Function() ' Await Task.Yield ' Return New List(Of Test) From {New Test With {.Async = "test2", .Await = 2}, New Test With {.Async = "test3", .Await = 3}} ' End Function ' Dim Query = From x2 In Await AwaitableLambda1() Select New With {.async = x2, .b = Function(Await) ' Return Await.Await + 1 ' End Function.Invoke(.async)} End Sub End Module Public Class Test Public Property Await As Integer = 1 Public Property Async As String = "Test" End Class ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, LatestVbReferences, TestOptions.ReleaseExe) AssertTheseDiagnostics(compilation, <expected> </expected>) End Sub <Fact()> Public Sub AsyncWithObsolete_Errors() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Imports System.Runtime.CompilerServices Public Class MyTask(Of T) <Obsolete("Do not use!", True)> Public Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T)() End Function Async Function Test() As Task Await Me End Function End Class Public Class MyTaskAwaiter(Of T) Implements INotifyCompletion Public Sub OnCompleted(continuation As Action) Implements INotifyCompletion.OnCompleted End Sub <Obsolete("Do not use!", True)> Public Function GetResult() As T Return Nothing End Function <Obsolete("Do not use!", True)> Public ReadOnly Property IsCompleted As Boolean Get Return True End Get End Property End Class ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseDll) AssertTheseDiagnostics(compilation, <expected> BC30668: 'Public Function GetAwaiter() As MyTaskAwaiter(Of T)' is obsolete: 'Do not use!'. Await Me ~~~~~~~~ BC30668: 'Public Function GetResult() As T' is obsolete: 'Do not use!'. Await Me ~~~~~~~~ BC30668: 'Public ReadOnly Property IsCompleted As Boolean' is obsolete: 'Do not use!'. Await Me ~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AsyncWithObsolete_Warnings() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Imports System.Runtime.CompilerServices Public Class MyTask(Of T) <Obsolete("Do not use!", False)> Public Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T)() End Function Async Function Test() As Task Await Me End Function End Class Public Class MyTaskAwaiter(Of T) Implements INotifyCompletion Public Sub OnCompleted(continuation As Action) Implements INotifyCompletion.OnCompleted End Sub <Obsolete("Do not use!", False)> Public Function GetResult() As T Return Nothing End Function <Obsolete("Do not use!", False)> Public ReadOnly Property IsCompleted As Boolean Get Return True End Get End Property End Class ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseDll) AssertTheseDiagnostics(compilation, <expected> BC40000: 'Public Function GetAwaiter() As MyTaskAwaiter(Of T)' is obsolete: 'Do not use!'. Await Me ~~~~~~~~ BC40000: 'Public Function GetResult() As T' is obsolete: 'Do not use!'. Await Me ~~~~~~~~ BC40000: 'Public ReadOnly Property IsCompleted As Boolean' is obsolete: 'Do not use!'. Await Me ~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AsyncWithObsolete_Interface() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Imports System.Runtime.CompilerServices Public Class MyTask(Of T) Public Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T)() End Function Async Function Test() As Task Await Me End Function End Class <Obsolete("Do not use!", True)> Public Class MyTaskAwaiter(Of T) Implements INotifyCompletion Public Sub OnCompleted(continuation As Action) Implements INotifyCompletion.OnCompleted End Sub Public Function GetResult() As T Return Nothing End Function Public ReadOnly Property IsCompleted As Boolean Get Return True End Get End Property End Class ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseDll) AssertTheseDiagnostics(compilation, <expected> BC30668: 'MyTaskAwaiter(Of T)' is obsolete: 'Do not use!'. Public Function GetAwaiter() As MyTaskAwaiter(Of T) ~~~~~~~~~~~~~~~~~~~ BC30668: 'MyTaskAwaiter(Of T)' is obsolete: 'Do not use!'. Return New MyTaskAwaiter(Of T)() ~~~~~~~~~~~~~~~~~~~ </expected>) End Sub <Fact()> Public Sub AsyncWithObsolete_InterfaceMethod() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Imports System.Runtime.CompilerServices Public Class MyTask(Of T) Public Function GetAwaiter() As MyTaskAwaiter(Of T) Return New MyTaskAwaiter(Of T)() End Function Async Function Test() As Task Await Me End Function End Class Public Class MyTaskAwaiter(Of T) Implements INotifyCompletion <Obsolete("Do not use!", True)> Public Sub OnCompleted(continuation As Action) Implements INotifyCompletion.OnCompleted End Sub Public Function GetResult() As T Return Nothing End Function Public ReadOnly Property IsCompleted As Boolean Get Return True End Get End Property End Class ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseDll) AssertTheseDiagnostics(compilation, <expected></expected>) End Sub <Fact()> Public Sub Legacy_Async_Overload_Change_3() Dim source = <compilation> <file name="a.vb"> <%= SemanticResourceUtil.Async_Overload_Change_3_vb %> </file> </compilation> Dim warnings = New Dictionary(Of String, ReportDiagnostic)() warnings.Add(MessageProvider.Instance.GetIdForErrorCode(42356), ReportDiagnostic.Suppress) Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe.WithSpecificDiagnosticOptions(New ReadOnlyDictionary(Of String, ReportDiagnostic)(warnings))) CompileAndVerify(compilation, expectedOutput:="") End Sub <Fact(), WorkItem(1066694, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1066694")> Public Sub Bug1066694() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Module Module1 Sub Main() System.Console.WriteLine("Non-Async") System.Console.WriteLine() TestLocal() System.Console.WriteLine() System.Console.WriteLine("Async") System.Console.WriteLine() Task.WaitAll(TestLocalAsync()) End Sub Sub TestLocal() Dim l = New TestClass("Unchanged") l.M1(l, Mutate(l)) System.Console.WriteLine(l.State) End Sub Async Function DummyAsync(x As Object) As Task(Of Object) Return x End Function Async Function TestLocalAsync() As Task Dim l = New TestClass("Unchanged") l.M1(l, Await DummyAsync(Mutate(l))) System.Console.WriteLine(l.State) End Function Function Mutate(ByRef x As TestClass) As Object x = New TestClass("Changed") Return x End Function End Module Class TestClass Private ReadOnly fld1 As String Sub New(val As String) fld1 = val End Sub Function State() As String Return fld1 End Function Sub M1(arg1 As TestClass, arg2 As Object) System.Console.WriteLine(Me.State) System.Console.WriteLine(arg1.State) End Sub End Class ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.ReleaseExe) CompileAndVerify(compilation, expectedOutput:= <![CDATA[ Non-Async Unchanged Unchanged Changed Async Unchanged Unchanged Changed ]]>) End Sub <Fact(), WorkItem(1068084, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1068084")> Public Sub Bug1068084() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System.Threading.Tasks Class Test Async Sub F() Await Task.Delay(0) End Sub End Class ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626}, TestOptions.ReleaseDll) AssertTheseEmitDiagnostics(compilation, <expected> BC35000: Requested operation is not available because the runtime library function 'Microsoft.VisualBasic.CompilerServices.ProjectData.ClearProjectError' is not defined. Async Sub F() ~~~~~~~~~~~~~~ BC35000: Requested operation is not available because the runtime library function 'Microsoft.VisualBasic.CompilerServices.ProjectData.SetProjectError' is not defined. Async Sub F() ~~~~~~~~~~~~~~ </expected>) End Sub <Fact(), WorkItem(1021941, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1021941")> Public Sub Bug1021941() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Imports System Imports System.Threading.Tasks Interface IMoveable Sub M1(x As Integer, y As Integer, z As Integer) Function M2() As Integer End Interface Class Item Implements IMoveable Public Property Name As String Public Sub M1(x As Integer, y As Integer, z As Integer) Implements IMoveable.M1 Console.WriteLine("M1 is called for item '{0}'", Me.Name) End Sub Public Function M2() As Integer Implements IMoveable.M2 Console.WriteLine("M2 is called for item '{0}'", Me.Name) Return 0 End Function End Class Class Program Shared Sub Main() Dim item = New Item With {.Name = "Goo"} Task.WaitAll(Shift(item)) End Sub Shared Async Function Shift(Of T As {Class, IMoveable})(item As T) As Task(Of Integer) item.M1(item.M2(), Await DummyAsync(), GetOffset(item)) Return 0 End Function Shared Async Function DummyAsync() As Task(Of Integer) Return 0 End Function Shared Function GetOffset(Of T)(ByRef item As T) As Integer item = DirectCast(DirectCast(New Item With {.Name = "Bar"}, IMoveable), T) Return 0 End Function End Class ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.DebugExe) CompileAndVerify(compilation, <![CDATA[ M2 is called for item 'Goo' M1 is called for item 'Goo' ]]>) End Sub <Fact(), WorkItem(1173166, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1173166"), WorkItem(2878, "https://github.com/dotnet/roslyn/issues/2878")> Public Sub CompoundAssignment() Dim source = <compilation> <file name="a.vb"> <![CDATA[ Public Class Test Private _field As UInteger Shared Sub Main() Dim t as New Test() System.Console.WriteLine(t._field) t.EventHandler(-1).Wait() System.Console.WriteLine(t._field) End Sub Private Async Function EventHandler(args As Integer) As System.Threading.Tasks.Task Await RunAsync(Async Function() System.Console.WriteLine(args) _field += CUInt(1) End Function) End Function Private Async Function RunAsync(x As System.Func(Of System.Threading.Tasks.Task)) As System.Threading.Tasks.Task Await x() End Function End Class ]]> </file> </compilation> Dim compilation = CreateEmptyCompilationWithReferences(source, {MscorlibRef_v4_0_30316_17626, MsvbRef_v4_0_30319_17929}, TestOptions.DebugExe) Dim expected As Xml.Linq.XCData = <![CDATA[ 0 -1 1 ]]> CompileAndVerify(compilation, expected) CompileAndVerify(compilation.WithOptions(TestOptions.ReleaseExe), expected) End Sub End Class End Namespace