|
' Licensed to the .NET Foundation under one or more agreements.
' The .NET Foundation licenses this file to you under the MIT license.
' See the LICENSE file in the project root for more information.
Imports Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.VisualBasic
Imports Roslyn.Test.Utilities
Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests
Public Class ErrorHandlingTests
Inherits BasicTestBase
<Fact()>
Public Sub ErrorHandler_WithValidLabel_No_Resume()
Dim compilationDef =
<compilation>
<file name="a.vb">
Imports System
Module Module1
Sub Main()
Dim sPath As String = ""
sPath = "Test1"
On Error GoTo goo
Error 5
Console.WriteLine(sPath)
Exit Sub
goo:
sPath &= "goo"
Console.WriteLine(sPath)
End Sub
End Module
</file>
</compilation>
Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef)
CompileAndVerify(compilation)
End Sub
<Fact()>
Public Sub ErrorHandler_WithGotoMinus1andMatchingLabel()
Dim compilationDef =
<compilation>
<file name="a.vb">
Imports System
Module Module1
Public Sub Main()
On Error GoTo -1
Error 5
exit sub
goo:
Resume
End Sub
End Module
</file>
</compilation>
Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef)
CompileAndVerify(compilation)
End Sub
<Fact()>
Public Sub Error_ErrorHandler_WithGoto0andNoMatchingLabel()
Dim compilationDef =
<compilation>
<file name="a.vb">
Imports System
Module Module1
Public Sub Main()
On Error GoTo 0
Error 5
exit sub
Goo:
Resume
End Sub
End Module
</file>
</compilation>
Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef)
CompileAndVerify(compilation)
'compilation.VerifyDiagnostics()
End Sub
<Fact()>
Public Sub Error_ErrorHandler_WithResumeNext()
Dim compilationDef =
<compilation>
<file name="a.vb">
Imports System
Module Module1
Public Sub Main()
On Error Resume Next
Error 5
exit sub
End Sub
End Module
</file>
</compilation>
Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef)
CompileAndVerify(compilation)
'compilation.VerifyDiagnostics()
End Sub
<Fact()>
Public Sub ErrorHandler_WithValidLabelMatchingKeywordsEscaped()
Dim compilationDef =
<compilation>
<file name="a.vb">
Imports System
Module Module1
Public Sub Main()
On Error GoTo [On]
On Error GoTo [goto] 'Doesn't matter if case mismatch (Didn't pretty list correctly)
On Error GoTo [Error]
exit sub
[Goto]:
Resume [on]
[On]:
Resume [Error]
[Error]:
Resume [Goto]
End Sub
End Module
</file>
</compilation>
Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef)
CompileAndVerify(compilation)
' compilation.VerifyDiagnostics()
End Sub
<Fact()>
Public Sub Error_ErrorHandler_WithValidLabelMatchingKeywordsNotEscaped()
Dim compilationDef =
<compilation>
<file name="a.vb">
Module Module1
Public Sub Main()
On Error GoTo On
On Error GoTo goto
On Error GoTo Error
[Goto]:
Resume [on]
[On]:
Resume [Error]
[Error]:
Resume [Goto]
End Sub
End Module
</file>
</compilation>
Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef)
compilation.VerifyDiagnostics(Diagnostic(ERRID.ERR_ExpectedIdentifier, ""),
Diagnostic(ERRID.ERR_ExpectedIdentifier, ""),
Diagnostic(ERRID.ERR_ExpectedIdentifier, ""),
Diagnostic(ERRID.ERR_LabelNotDefined1, "").WithArguments(""),
Diagnostic(ERRID.ERR_LabelNotDefined1, "").WithArguments(""),
Diagnostic(ERRID.ERR_LabelNotDefined1, "").WithArguments(""))
End Sub
<Fact()>
Public Sub Error_ErrorHandler_WithInValidLabelMatchingKeywordsEscaped()
Dim compilationDef =
<compilation>
<file name="a.vb">
Module Module1
Public Sub Main()
On Error GoTo [On]
On Error GoTo [goto] 'Doesn't matter if case mismatch (Didn't pretty list correctly)
On Error GoTo [Error]
Goto:
Resume on
On:
Resume Error
Error:
Resume Goto
End Sub
End Module
</file>
</compilation>
Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef)
compilation.VerifyDiagnostics(Diagnostic(ERRID.ERR_ExpectedIdentifier, ""),
Diagnostic(ERRID.ERR_ExpectedIdentifier, ""),
Diagnostic(ERRID.ERR_ObsoleteOnGotoGosub, ""),
Diagnostic(ERRID.ERR_ExpectedIdentifier, ""),
Diagnostic(ERRID.ERR_ExpectedExpression, ""),
Diagnostic(ERRID.ERR_ExpectedIdentifier, ""),
Diagnostic(ERRID.ERR_LabelNotDefined1, "[On]").WithArguments("On"),
Diagnostic(ERRID.ERR_LabelNotDefined1, "[goto]").WithArguments("goto"),
Diagnostic(ERRID.ERR_LabelNotDefined1, "[Error]").WithArguments("Error"),
Diagnostic(ERRID.ERR_LabelNotDefined1, "").WithArguments(""),
Diagnostic(ERRID.ERR_LabelNotDefined1, "").WithArguments(""),
Diagnostic(ERRID.ERR_LabelNotDefined1, "").WithArguments(""),
Diagnostic(ERRID.ERR_LabelNotDefined1, "").WithArguments(""),
Diagnostic(ERRID.ERR_LabelNotDefined1, "").WithArguments(""))
End Sub
<Fact()>
Public Sub Error_ErrorHandler_WithGoto0andMatchingLabel()
Dim compilationDef =
<compilation>
<file name="a.vb">
Imports System
Module Module1
Public Sub Main()
On Error GoTo 0
Error 5
exit sub
0:
Resume
End Sub
End Module
</file>
</compilation>
Dim compilation = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(compilationDef)
Dim compilationVerifier = CompileAndVerify(compilation)
compilationVerifier.VerifyIL("Module1.Main", <![CDATA[
{
// Code size 155 (0x9b)
.maxstack 3
.locals init (Integer V_0,
Integer V_1,
Integer V_2,
Integer V_3)
.try
{
IL_0000: call "Sub Microsoft.VisualBasic.CompilerServices.ProjectData.ClearProjectError()"
IL_0005: ldc.i4.0
IL_0006: stloc.0
IL_0007: ldc.i4.2
IL_0008: stloc.2
IL_0009: ldc.i4.5
IL_000a: call "Function Microsoft.VisualBasic.CompilerServices.ProjectData.CreateProjectError(Integer) As System.Exception"
IL_000f: throw
IL_0010: ldc.i4.0
IL_0011: stloc.3
IL_0012: ldc.i4.5
IL_0013: stloc.2
IL_0014: call "Sub Microsoft.VisualBasic.CompilerServices.ProjectData.ClearProjectError()"
IL_0019: ldloc.1
IL_001a: brtrue.s IL_0029
IL_001c: ldc.i4 0x800a0014
IL_0021: call "Function Microsoft.VisualBasic.CompilerServices.ProjectData.CreateProjectError(Integer) As System.Exception"
IL_0026: throw
IL_0027: leave.s IL_0092
IL_0029: ldloc.1
IL_002a: br.s IL_002f
IL_002c: ldloc.1
IL_002d: ldc.i4.1
IL_002e: add
IL_002f: ldc.i4.0
IL_0030: stloc.1
IL_0031: switch (
IL_0052,
IL_0000,
IL_0007,
IL_0027,
IL_0010,
IL_0012,
IL_0027)
IL_0052: leave.s IL_0087
IL_0054: ldloc.2
IL_0055: stloc.1
IL_0056: ldloc.0
IL_0057: switch (
IL_0064,
IL_002c)
IL_0064: leave.s IL_0087
}
filter
{
IL_0066: isinst "System.Exception"
IL_006b: ldnull
IL_006c: cgt.un
IL_006e: ldloc.0
IL_006f: ldc.i4.0
IL_0070: cgt.un
IL_0072: and
IL_0073: ldloc.1
IL_0074: ldc.i4.0
IL_0075: ceq
IL_0077: and
IL_0078: endfilter
} // end filter
{ // handler
IL_007a: castclass "System.Exception"
IL_007f: ldloc.3
IL_0080: call "Sub Microsoft.VisualBasic.CompilerServices.ProjectData.SetProjectError(System.Exception, Integer)"
IL_0085: leave.s IL_0054
}
IL_0087: ldc.i4 0x800a0033
IL_008c: call "Function Microsoft.VisualBasic.CompilerServices.ProjectData.CreateProjectError(Integer) As System.Exception"
IL_0091: throw
IL_0092: ldloc.1
IL_0093: brfalse.s IL_009a
IL_0095: call "Sub Microsoft.VisualBasic.CompilerServices.ProjectData.ClearProjectError()"
IL_009a: ret
}
]]>)
End Sub
<ConditionalFact(GetType(DesktopOnly), Reason:="https://github.com/dotnet/roslyn/issues/28044")>
Public Sub Error_ErrorHandler_WithGoto1andMatchingLabel()
Dim compilationDef =
<compilation>
<file name="a.vb">
Imports System
Module Module1
Public Sub Main()
On Error GoTo 1
Console.writeline("Start")
Error 5
Console.writeline("2")
exit sub
1:
Console.writeline("1")
Resume Next
End Sub
End Module
</file>
</compilation>
Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe)
CompileAndVerify(compilation, expectedOutput:=<![CDATA[Start
1
2]]>)
End Sub
<Fact()>
Public Sub Error_ErrorHandler_WithMissingOrIncorrectLabels()
Dim compilationDef =
<compilation>
<file name="a.vb">
Module Module1
sing Labels
Public Sub Main()
End Sub
Sub Goto_MissingLabel()
'Error - label is not present
On Error GoTo goo
End Sub
Sub GotoLabelInDifferentMethod()
'Error - no label in this method, in a different so it will fail
On Error GoTo diffMethodLabel
End Sub
Sub GotoLabelInDifferentMethod()
'Error - no label in this method - trying to fully qualify will fail
On Error GoTo DifferentMethod.diffMethodLabel
End Sub
Sub DifferentMethod()
DiffMethodLabel:
End Sub
End Module
</file>
</compilation>
Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe)
compilation.VerifyDiagnostics(Diagnostic(ERRID.ERR_ExpectedSpecifier, "Labels"),
Diagnostic(ERRID.ERR_ExpectedDeclaration, "sing"),
Diagnostic(ERRID.ERR_ExpectedEOS, "."),
Diagnostic(ERRID.ERR_DuplicateProcDef1, "GotoLabelInDifferentMethod").WithArguments("Public Sub GotoLabelInDifferentMethod()"),
Diagnostic(ERRID.ERR_LabelNotDefined1, "goo").WithArguments("goo"),
Diagnostic(ERRID.ERR_LabelNotDefined1, "diffMethodLabel").WithArguments("diffMethodLabel"),
Diagnostic(ERRID.ERR_LabelNotDefined1, "DifferentMethod").WithArguments("DifferentMethod"))
End Sub
<ConditionalFact(GetType(WindowsOnly), Reason:="https://github.com/dotnet/roslyn/issues/29568")>
Public Sub Error_ErrorHandler_BothTypesOfErrorHandling()
Dim compilationDef =
<compilation>
<file name="a.vb">
Imports System
Module Module1
Sub Main
TryAndOnErrorInSameMethod
OnErrorAndTryInSameMethod
End Sub
Sub TryAndOnErrorInSameMethod()
'Nested
Try
On Error GoTo goo
goo:
Catch ex As Exception
End Try
End Sub
Sub OnErrorAndTryInSameMethod()
'Sequential
On Error GoTo goo
goo:
Try
Catch ex As Exception
End Try
End Sub
End Module
</file>
</compilation>
Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe)
Dim ExpectedOutput = <![CDATA[Try
On Error GoTo goo
goo:
Catch ex As Exception
End Try]]>
Dim ExpectedOutput2 = <![CDATA[Try
Catch ex As Exception
End Try]]>
compilation.VerifyDiagnostics(Diagnostic(ERRID.ERR_TryAndOnErrorDoNotMix, ExpectedOutput),
Diagnostic(ERRID.ERR_TryAndOnErrorDoNotMix, "On Error GoTo goo"),
Diagnostic(ERRID.ERR_TryAndOnErrorDoNotMix, "On Error GoTo goo"),
Diagnostic(ERRID.ERR_TryAndOnErrorDoNotMix, ExpectedOutput2)
)
End Sub
<ConditionalFact(GetType(WindowsOnly), Reason:="https://github.com/dotnet/roslyn/issues/29568")>
Public Sub Error_ErrorHandler_InVBCore()
'Old Style handling not supported in VBCore
Dim compilationDef =
<compilation>
<file name="a.vb">
Module Module1
Public Sub Main
On Error GoTo goo
goo:
End Sub
End Module
</file>
</compilation>
Dim compilation = CompilationUtils.CreateEmptyCompilationWithReferences(compilationDef,
references:={MscorlibRef, SystemRef, SystemCoreRef},
options:=TestOptions.ReleaseDll.WithEmbedVbCoreRuntime(True))
Dim ExpectedOutput = <![CDATA[Public Sub Main
On Error GoTo goo
goo:
End Sub]]>
compilation.VerifyEmitDiagnostics(Diagnostic(ERRID.ERR_PlatformDoesntSupport, ExpectedOutput).WithArguments("Unstructured exception handling").WithLocation(2, 9))
End Sub
<Fact()>
Public Sub Error_ErrorHandler_InVBCore_LateBound1()
Dim compilationDef =
<compilation>
<file name="a.vb">
Module Module1
Dim a As Object
Sub Main()
a = New ABC
a = a + 1
a = a & "test"
End Sub
End Module
Class ABC
End Class
</file>
</compilation>
Dim compilation = CompilationUtils.CreateEmptyCompilationWithReferences(compilationDef,
references:={MscorlibRef, SystemRef, SystemCoreRef},
options:=TestOptions.ReleaseDll.WithEmbedVbCoreRuntime(True))
compilation.VerifyEmitDiagnostics(Diagnostic(ERRID.ERR_PlatformDoesntSupport, "a + 1").WithArguments("Late binding").WithLocation(6, 13),
Diagnostic(ERRID.ERR_PlatformDoesntSupport, "a & ""test""").WithArguments("Late binding").WithLocation(8, 13)
)
End Sub
<Fact()>
Public Sub Error_ErrorHandler_InVBCore_LikeOperator()
Dim compilationDef =
<compilation>
<file name="a.vb">
Module Module1
Sub Main()
Dim testCheck As Boolean
testCheck = "F" Like "F"
End Sub
End Module
</file>
</compilation>
Dim compilation = CompilationUtils.CreateEmptyCompilationWithReferences(compilationDef,
references:={MscorlibRef, SystemRef, SystemCoreRef},
options:=TestOptions.ReleaseDll.WithEmbedVbCoreRuntime(True))
Dim ExpectedOutput = <![CDATA["F" Like "F"]]>
compilation.VerifyEmitDiagnostics(Diagnostic(ERRID.ERR_PlatformDoesntSupport, ExpectedOutput).WithArguments("Like operator").WithLocation(5, 21))
End Sub
<Fact()>
Public Sub Error_ErrorHandler_InVBCore_ErrObject()
Dim compilationDef =
<compilation>
<file name="a.vb">
Module Module1
Sub Main()
Error 1
End Sub
End Module
</file>
</compilation>
Dim compilation = CompilationUtils.CreateEmptyCompilationWithReferences(compilationDef,
references:={MscorlibRef, SystemRef, SystemCoreRef},
options:=TestOptions.ReleaseDll.WithEmbedVbCoreRuntime(True))
compilation.VerifyEmitDiagnostics(Diagnostic(ERRID.ERR_PlatformDoesntSupport, "Error 1").WithArguments("Unstructured exception handling").WithLocation(4, 18))
End Sub
<Fact()>
Public Sub Error_ErrorHandler_InVBCore_AnonymousType()
Dim source =
<compilation>
<file name="a.vb">
Module Module1
Dim a As Object
Sub Main()
a = "1"
Dim x = New With {.a = a, .b = a + 1}
End Sub
End Module
</file>
</compilation>
Dim compilation = CompilationUtils.CreateEmptyCompilationWithReferences(source,
references:={MscorlibRef, SystemRef, SystemCoreRef},
options:=TestOptions.ReleaseDll.WithEmbedVbCoreRuntime(True))
compilation.VerifyEmitDiagnostics(Diagnostic(ERRID.ERR_PlatformDoesntSupport, "a + 1").WithArguments("Late binding").WithLocation(6, 40))
End Sub
<Fact(), WorkItem(545772, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545772")>
Public Sub VbCoreMyNamespace()
Dim source =
<compilation>
<file name="a.vb">
Module Module1
Public Sub Main()
My.Computer.FileSystem.WriteAllText("Test.txt","abc")
End Sub
End Module
</file>
</compilation>
Dim compilation = CompilationUtils.CreateEmptyCompilationWithReferences(source,
references:={MscorlibRef, SystemRef, SystemCoreRef},
options:=TestOptions.ReleaseDll.WithEmbedVbCoreRuntime(True))
compilation.VerifyDiagnostics(Diagnostic(ERRID.ERR_PlatformDoesntSupport, "My").WithArguments("My").WithLocation(3, 13))
End Sub
<Fact()>
Public Sub Error_ErrorHandler_OutsideOfMethodBody()
Dim compilationDef =
<compilation>
<file name="a.vb">
Module Module1
Sub Main
End Sub
'Error Outside of Method Body
On Error Goto goo
Sub Goo
End Sub
End Module
</file>
</compilation>
Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe)
compilation.VerifyDiagnostics(Diagnostic(ERRID.ERR_ExecutableAsDeclaration, "On Error Goto goo"))
End Sub
<Fact()>
Public Sub ErrorHandler_In_Different_Types()
'Basic Validation that this is permissible in Class/Structure/(Module Tested elsewhere)
'Generic
Dim compilationDef =
<compilation>
<file name="a.vb">
Imports System
Module Module1
Sub Main
End Sub
Class Goo
Sub Method()
On Error GoTo CLassMethodLabel
CLassMethodLabel:
End Sub
Public Property ABC As String
Set(value As String)
On Error GoTo setLabel
setLabel:
End Set
Get
On Error GoTo getLabel
getLabel:
End Get
End Property
End Class
Structure Goo_Struct
Sub Method()
On Error GoTo StructMethodLabel
StructMethodLabel:
End Sub
Public Property ABC As String
Set(value As String)
On Error GoTo SetLabel
setLabel:
End Set
Get
On Error GoTo getLabel
getLabel:
End Get
End Property
End Structure
Class GenericGoo(Of t)
Sub Method()
'Normal Method In Generic Class
On Error GoTo CLassMethodLabel
CLassMethodLabel:
End Sub
Sub GenericMethod(Of u)(x As u)
'Generic Method In Generic Class
On Error GoTo CLassMethodLabel
CLassMethodLabel:
End Sub
Public Property ABC As String
Set(value As String)
On Error GoTo setLabel
setLabel:
End Set
Get
On Error GoTo getLabel
getLabel:
End Get
End Property
End Class
End Module
</file>
</compilation>
Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe)
compilation.AssertNoDiagnostics()
End Sub
<Fact()>
Public Sub ErrorHandler_Other_Constructor_Dispose()
Dim compilationDef =
<compilation>
<file name="a.vb">
Imports System
Module Module1
Sub Main
Dim X As New TestInConstructor
Dim X2 As New TestInDisposeAndFinalize
X2.Dispose()
End Sub
End Module
Class TestInConstructor
Sub New()
On Error GoTo constructorError
ConstructorError:
End Sub
End Class
Class TestInDisposeAndFinalize
Implements IDisposable
Sub New()
End Sub
#Region "IDisposable Support"
Private disposedValue As Boolean ' To detect redundant calls
' IDisposable
Protected Overridable Sub Dispose(disposing As Boolean)
On Error GoTo ConstructorError
If Not Me.disposedValue Then
If disposing Then
' TODO: dispose managed state (managed objects).
End If
' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below.
' TODO: set large fields to null.
End If
Me.disposedValue = True
ConstructorError:
End Sub
' TODO: override Finalize() only if Dispose(ByVal disposing As Boolean) above has code to free unmanaged resources.
Protected Overrides Sub Finalize()
On Error GoTo FInalizeError
' Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above.
Dispose(False)
MyBase.Finalize()
FInalizeError:
End Sub
' This code added by Visual Basic to correctly implement the disposable pattern.
Public Sub Dispose() Implements IDisposable.Dispose
' Do not change this code. Put cleanup code in Dispose(disposing As Boolean) above.
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
#End Region
End Class
</file>
</compilation>
Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe)
compilation.VerifyDiagnostics()
End Sub
<Fact()>
Public Sub Error_InvalidTypes_ImplicitConversions()
Dim compilationDef =
<compilation>
<file name="a.vb">
Imports System
Module Module1
Sub Main
Error 1L
Error 2S
Error "3"
Error 4!
Error 5%
End Sub
End Module
</file>
</compilation>
Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe)
compilation.AssertNoDiagnostics()
End Sub
<Fact()>
Public Sub Error_InvalidTypes_InvalidTypes_StrictOn()
Dim compilationDef =
<compilation>
<file name="a.vb">
Option Strict On
Module Module1
Sub Main
Error 1L
Error 2S
Error "3"
Error 4!
Error 5%
End Sub
End Module
</file>
</compilation>
Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe)
compilation.VerifyDiagnostics(Diagnostic(ERRID.ERR_NarrowingConversionDisallowed2, """3""").WithArguments("String", "Integer"),
Diagnostic(ERRID.ERR_NarrowingConversionDisallowed2, "4!").WithArguments("Single", "Integer"))
End Sub
<Fact()>
Public Sub ErrorHandler_Error_InSyncLockBlock()
Dim compilationDef =
<compilation>
<file name="a.vb">
Class LockClass
End Class
Module Module1
Sub Main()
Dim lock As New LockClass
On Error GoTo handler
SyncLock lock
On Error GoTo goo
goo:
Resume Next
End SyncLock
Exit Sub
End Sub
End Module
</file>
</compilation>
Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe)
compilation.VerifyDiagnostics(Diagnostic(ERRID.ERR_LabelNotDefined1, "handler").WithArguments("handler"),
Diagnostic(ERRID.ERR_OnErrorInSyncLock, "On Error GoTo goo"))
End Sub
<ConditionalFact(GetType(DesktopOnly), Reason:="https://github.com/dotnet/roslyn/issues/28044")>
Public Sub ErrorHandler_Error_InMethodWithSyncLockBlock()
'Method has a Error Handler and Error Occurs within SyncLock
'resume next will occur outside of the SyncLock Block
Dim compilationDef =
<compilation>
<file name="a.vb">
Imports System
Class LockClass
End Class
Module Module1
Sub Main()
Dim lock As New LockClass
Console.WriteLine("Start")
On Error GoTo handler
SyncLock lock
Console.WriteLine("In SyncLock")
Error 1
Console.WriteLine("After Error In SyncLock")
End SyncLock
Console.WriteLine("End")
Exit Sub
handler:
Console.WriteLine("Handler")
Resume Next
End Sub
End Module
</file>
</compilation>
Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.ReleaseExe)
compilation.VerifyDiagnostics()
Dim CompilationVerifier = CompileAndVerify(compilation, expectedOutput:=<![CDATA[Start
In SyncLock
Handler
End]]>)
CompilationVerifier.VerifyIL("Module1.Main", <![CDATA[
{
// Code size 248 (0xf8)
.maxstack 3
.locals init (Integer V_0,
Integer V_1,
Integer V_2,
LockClass V_3, //lock
Object V_4,
Boolean V_5)
.try
{
IL_0000: ldc.i4.1
IL_0001: stloc.2
IL_0002: newobj "Sub LockClass..ctor()"
IL_0007: stloc.3
IL_0008: ldc.i4.2
IL_0009: stloc.2
IL_000a: ldstr "Start"
IL_000f: call "Sub System.Console.WriteLine(String)"
IL_0014: call "Sub Microsoft.VisualBasic.CompilerServices.ProjectData.ClearProjectError()"
IL_0019: ldc.i4.2
IL_001a: stloc.0
IL_001b: ldc.i4.4
IL_001c: stloc.2
IL_001d: ldloc.3
IL_001e: stloc.s V_4
IL_0020: ldc.i4.0
IL_0021: stloc.s V_5
.try
{
IL_0023: ldloc.s V_4
IL_0025: ldloca.s V_5
IL_0027: call "Sub System.Threading.Monitor.Enter(Object, ByRef Boolean)"
IL_002c: ldstr "In SyncLock"
IL_0031: call "Sub System.Console.WriteLine(String)"
IL_0036: ldc.i4.1
IL_0037: call "Function Microsoft.VisualBasic.CompilerServices.ProjectData.CreateProjectError(Integer) As System.Exception"
IL_003c: throw
}
finally
{
IL_003d: ldloc.s V_5
IL_003f: brfalse.s IL_0048
IL_0041: ldloc.s V_4
IL_0043: call "Sub System.Threading.Monitor.Exit(Object)"
IL_0048: endfinally
}
IL_0049: ldc.i4.5
IL_004a: stloc.2
IL_004b: ldstr "End"
IL_0050: call "Sub System.Console.WriteLine(String)"
IL_0055: br.s IL_0078
IL_0057: ldc.i4.7
IL_0058: stloc.2
IL_0059: ldstr "Handler"
IL_005e: call "Sub System.Console.WriteLine(String)"
IL_0063: ldc.i4.8
IL_0064: stloc.2
IL_0065: call "Sub Microsoft.VisualBasic.CompilerServices.ProjectData.ClearProjectError()"
IL_006a: ldloc.1
IL_006b: brtrue.s IL_007a
IL_006d: ldc.i4 0x800a0014
IL_0072: call "Function Microsoft.VisualBasic.CompilerServices.ProjectData.CreateProjectError(Integer) As System.Exception"
IL_0077: throw
IL_0078: leave.s IL_00ef
IL_007a: ldloc.1
IL_007b: ldc.i4.1
IL_007c: add
IL_007d: ldc.i4.0
IL_007e: stloc.1
IL_007f: switch (
IL_00ac,
IL_0000,
IL_0008,
IL_0014,
IL_001b,
IL_0049,
IL_0078,
IL_0057,
IL_0063,
IL_0078)
IL_00ac: leave.s IL_00e4
IL_00ae: ldloc.2
IL_00af: stloc.1
IL_00b0: ldloc.0
IL_00b1: switch (
IL_00c2,
IL_007a,
IL_0057)
IL_00c2: leave.s IL_00e4
}
filter
{
IL_00c4: isinst "System.Exception"
IL_00c9: ldnull
IL_00ca: cgt.un
IL_00cc: ldloc.0
IL_00cd: ldc.i4.0
IL_00ce: cgt.un
IL_00d0: and
IL_00d1: ldloc.1
IL_00d2: ldc.i4.0
IL_00d3: ceq
IL_00d5: and
IL_00d6: endfilter
} // end filter
{ // handler
IL_00d8: castclass "System.Exception"
IL_00dd: call "Sub Microsoft.VisualBasic.CompilerServices.ProjectData.SetProjectError(System.Exception)"
IL_00e2: leave.s IL_00ae
}
IL_00e4: ldc.i4 0x800a0033
IL_00e9: call "Function Microsoft.VisualBasic.CompilerServices.ProjectData.CreateProjectError(Integer) As System.Exception"
IL_00ee: throw
IL_00ef: ldloc.1
IL_00f0: brfalse.s IL_00f7
IL_00f2: call "Sub Microsoft.VisualBasic.CompilerServices.ProjectData.ClearProjectError()"
IL_00f7: ret
}
]]>)
End Sub
<Fact>
Public Sub SynthesizingDefaultConstructorsWithMsCorLibMissing_Nothing()
Dim comp = CompilationUtils.CreateEmptyCompilation("
Class Test
End Class
", options:=TestOptions.ReleaseDll.WithModuleName("testModule"))
CompilationUtils.AssertTheseDiagnostics(comp, <expected>
BC30002: Type 'System.Void' is not defined.
Class Test
~~~~~~~~~~~
BC31091: Import of type 'Object' from assembly or module 'testModule' failed.
Class Test
~~~~
</expected>)
End Sub
<Fact>
Public Sub SynthesizingDefaultConstructorsWithMsCorLibMissing_NoSystemVoid()
Dim comp = CompilationUtils.CreateEmptyCompilation("
Namespace System
Public Class [Object]
End Class
End Namespace
Class Test
End Class
", options:=TestOptions.ReleaseDll.WithModuleName("testModule"))
CompilationUtils.AssertTheseDiagnostics(comp, <expected>
BC30002: Type 'System.Void' is not defined.
Public Class [Object]
~~~~~~~~~~~~~~~~~~~~~~
BC30002: Type 'System.Void' is not defined.
Class Test
~~~~~~~~~~~
</expected>)
End Sub
<Fact>
Public Sub SynthesizingDefaultConstructorsWithMsCorLibMissing_NoSystemObject()
Dim comp = CompilationUtils.CreateEmptyCompilation("
Namespace System
Public Class Void
End Class
End Namespace
Class Test
End Class
", options:=TestOptions.ReleaseDll.WithModuleName("testModule"))
CompilationUtils.AssertTheseDiagnostics(comp, <expected>
BC31091: Import of type 'Object' from assembly or module 'testModule' failed.
Public Class Void
~~~~
BC31091: Import of type 'Object' from assembly or module 'testModule' failed.
Class Test
~~~~
</expected>)
End Sub
<Fact>
Public Sub SynthesizingDefaultConstructorsWithMsCorLibMissing_NoSystemObjectDefaultConstructor_01()
Dim comp = CompilationUtils.CreateEmptyCompilation("
Namespace System
Public Class [Object]
Public Sub New(other as Object)
End Sub
End Class
Public Class Void
Public Sub New()
MyBase.New(Nothing)
End Sub
End Class
End Namespace
Class Test
End Class
", options:=TestOptions.ReleaseDll.WithModuleName("testModule"))
CompilationUtils.AssertTheseDiagnostics(comp, <expected>
BC30387: Class 'Test' must declare a 'Sub New' because its base class 'Object' does not have an accessible 'Sub New' that can be called with no arguments.
Class Test
~~~~
</expected>)
End Sub
<Fact>
Public Sub SynthesizingDefaultConstructorsWithMsCorLibMissing_NoSystemObjectDefaultConstructor_02()
Dim comp = CompilationUtils.CreateEmptyCompilation("
Namespace System
Public Class [Object]
Public Sub New(other as Object)
End Sub
End Class
Public Class Void
Public Sub New()
MyBase.New(Nothing)
End Sub
End Class
End Namespace
", options:=TestOptions.ReleaseDll.WithModuleName("testModule"))
comp.VerifyEmitDiagnostics()
End Sub
End Class
End Namespace
|