diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Attributes/AttributeData.vb b/src/Compilers/VisualBasic/Portable/Symbols/Attributes/AttributeData.vb index 263ba82b4fdb5..f1547defa222a 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Attributes/AttributeData.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Attributes/AttributeData.vb @@ -243,9 +243,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols diagnostics.Add(If(nodeOpt IsNot Nothing, nodeOpt.Name.GetLocation, NoLocation.Singleton), useSiteInfo) End If - ' BC31205: First argument to a security attribute must be a valid SecurityAction - diagnostics.Add(ErrorFactory.ErrorInfo(ERRID.ERR_SecurityAttributeMissingAction, - Me.AttributeClass), + ' BC31211: First argument to a security attribute must be a valid SecurityAction + diagnostics.Add(ErrorFactory.ErrorInfo(ERRID.ERR_SecurityAttributeMissingAction), If(nodeOpt IsNot Nothing, nodeOpt.Name.GetLocation, NoLocation.Singleton)) hasErrors = True @@ -253,6 +252,31 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Return Nothing End Function + Friend Shared Function GetArgumentLocation(nodeOpt As AttributeSyntax, argumentIndex As Integer) As Location + Return GetArgumentDisplayAndLocation(nodeOpt, 0, argumentIndex).Location + End Function + + Private Shared Function GetArgumentDisplayAndLocation(nodeOpt As AttributeSyntax, value As Integer, argumentIndex As Integer) As (ArgumentDisplay As String, Location As Location) + If nodeOpt IsNot Nothing Then + If nodeOpt.ArgumentList IsNot Nothing AndAlso nodeOpt.ArgumentList.Arguments.Count > argumentIndex Then + Dim arg As ArgumentSyntax = nodeOpt.ArgumentList.Arguments(argumentIndex) + Return (arg.ToString(), arg.GetLocation()) + Else + Return (value.ToString(), nodeOpt.GetLocation()) + End If + Else + Return ("", NoLocation.Singleton) + End If + End Function + + Friend Shared Function GetFirstArgumentLocation(nodeOpt As AttributeSyntax) As Location + Return GetArgumentLocation(nodeOpt, argumentIndex:=0) + End Function + + Private Shared Function GetFirstArgumentDisplayAndLocation(nodeOpt As AttributeSyntax, value As Integer) As (ArgumentDisplay As String, Location As Location) + Return GetArgumentDisplayAndLocation(nodeOpt, value, argumentIndex:=0) + End Function + Private Function ValidateSecurityAction( typedValue As TypedConstant, targetSymbol As Symbol, @@ -271,10 +295,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols DeclarativeSecurityAction.LinkDemand If Me.IsTargetAttribute(targetSymbol, AttributeDescription.PrincipalPermissionAttribute) Then - ' BC31209: SecurityAction value '{0}' is invalid for PrincipalPermission attribute - diagnostics.Add(ERRID.ERR_PrincipalPermissionInvalidAction, - If(nodeOpt IsNot Nothing, nodeOpt.ArgumentList.Arguments(0).GetLocation(), NoLocation.Singleton), - If(nodeOpt IsNot Nothing, nodeOpt.ArgumentList.Arguments(0).ToString(), "")) + ' BC31215: SecurityAction value '{0}' is invalid for PrincipalPermission attribute + Dim displayAndLocation As (ArgumentDisplay As String, Location As Location) = GetFirstArgumentDisplayAndLocation(nodeOpt, securityAction) + diagnostics.Add(ERRID.ERR_PrincipalPermissionInvalidAction, displayAndLocation.Location, displayAndLocation.ArgumentDisplay) hasErrors = True Return DeclarativeSecurityAction.None @@ -301,11 +324,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols isPermissionRequestAction = True Case Else - ' BC31206: Security attribute '{0}' has an invalid SecurityAction value '{1}' - diagnostics.Add(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, - If(nodeOpt IsNot Nothing, nodeOpt.ArgumentList.Arguments(0).GetLocation(), NoLocation.Singleton), - If(nodeOpt IsNot Nothing, nodeOpt.Name.ToString, ""), - If(nodeOpt IsNot Nothing, nodeOpt.ArgumentList.Arguments(0).ToString(), "")) + ' BC31214: SecurityAction value '{0}' is invalid for security attributes applied to a type or a method. + Dim displayAndLocation As (ArgumentDisplay As String, Location As Location) = GetFirstArgumentDisplayAndLocation(nodeOpt, securityAction) + diagnostics.Add(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, displayAndLocation.Location, displayAndLocation.ArgumentDisplay) hasErrors = True Return DeclarativeSecurityAction.None @@ -315,10 +336,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols If targetSymbol.Kind = SymbolKind.NamedType OrElse targetSymbol.Kind = SymbolKind.Method Then ' Types and methods cannot take permission requests. - ' BC31208: SecurityAction value '{0}' is invalid for security attributes applied to a type or a method - diagnostics.Add(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, - If(nodeOpt IsNot Nothing, nodeOpt.ArgumentList.Arguments(0).GetLocation, NoLocation.Singleton), - If(nodeOpt IsNot Nothing, nodeOpt.ArgumentList.Arguments(0).ToString(), "")) + ' BC31214: SecurityAction value '{0}' is invalid for security attributes applied to a type or a method. + Dim displayAndLocation As (ArgumentDisplay As String, Location As Location) = GetFirstArgumentDisplayAndLocation(nodeOpt, securityAction) + diagnostics.Add(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, displayAndLocation.Location, displayAndLocation.ArgumentDisplay) hasErrors = True Return DeclarativeSecurityAction.None @@ -327,10 +347,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ElseIf targetSymbol.Kind = SymbolKind.Assembly Then ' Assemblies cannot take declarative security. - ' BC31207: SecurityAction value '{0}' is invalid for security attributes applied to an assembly - diagnostics.Add(ERRID.ERR_SecurityAttributeInvalidActionAssembly, - If(nodeOpt IsNot Nothing, nodeOpt.ArgumentList.Arguments(0).GetLocation, NoLocation.Singleton), - If(nodeOpt IsNot Nothing, nodeOpt.ArgumentList.Arguments(0).ToString(), "")) + ' BC31213: SecurityAction value '{0}' is invalid for security attributes applied to an assembly. + Dim displayAndLocation As (ArgumentDisplay As String, Location As Location) = GetFirstArgumentDisplayAndLocation(nodeOpt, securityAction) + diagnostics.Add(ERRID.ERR_SecurityAttributeInvalidActionAssembly, displayAndLocation.Location, displayAndLocation.ArgumentDisplay) hasErrors = True Return DeclarativeSecurityAction.None @@ -376,7 +395,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols If resolvedFilePath Is Nothing Then - ' BC31210: Unable to resolve file path '{0}' specified for the named argument '{1}' for PermissionSet attribute + ' BC31216: Unable to resolve file path '{0}' specified for the named argument '{1}' for PermissionSet attribute. Dim argSyntaxLocation As Location = If(arguments.AttributeSyntaxOpt IsNot Nothing, arguments.AttributeSyntaxOpt.ArgumentList.Arguments(1).GetLocation(), NoLocation.Singleton) @@ -429,14 +448,16 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Case ClassInterfaceType.None, Cci.Constants.ClassInterfaceType_AutoDispatch, Cci.Constants.ClassInterfaceType_AutoDual Exit Select Case Else - diagnostics.Add(ERRID.ERR_BadAttribute1, If(nodeOpt IsNot Nothing, nodeOpt.ArgumentList.Arguments(0).GetLocation(), NoLocation.Singleton), Me.AttributeClass) + Dim location As Location = GetFirstArgumentLocation(nodeOpt) + diagnostics.Add(ERRID.ERR_BadAttribute1, location, Me.AttributeClass) End Select End Sub Friend Sub DecodeInterfaceTypeAttribute(node As AttributeSyntax, diagnostics As BindingDiagnosticBag) Dim discarded As ComInterfaceType = Nothing If Not DecodeInterfaceTypeAttribute(discarded) Then - diagnostics.Add(ERRID.ERR_BadAttribute1, node.ArgumentList.Arguments(0).GetLocation(), Me.AttributeClass) + Dim location As Location = GetFirstArgumentLocation(node) + diagnostics.Add(ERRID.ERR_BadAttribute1, location, Me.AttributeClass) End If End Sub @@ -477,9 +498,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ' Native compiler allows only a specific GUID format: "D" format (32 digits separated by hyphens) Dim guidVal As Guid If Not Guid.TryParseExact(guidString, "D", guidVal) Then - diagnostics.Add(ERRID.ERR_BadAttributeUuid2, - If(nodeOpt IsNot Nothing, nodeOpt.ArgumentList.Arguments(0).GetLocation(), NoLocation.Singleton), - Me.AttributeClass, If(guidString, ObjectDisplay.NullLiteral)) + Dim location As Location = GetFirstArgumentLocation(nodeOpt) + diagnostics.Add(ERRID.ERR_BadAttributeUuid2, location, Me.AttributeClass, If(guidString, ObjectDisplay.NullLiteral)) End If End Sub diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceAssemblySymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceAssemblySymbol.vb index a17ea95d20bda..13733e7c3a794 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceAssemblySymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceAssemblySymbol.vb @@ -1133,7 +1133,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols For i = 0 To argCount - 1 Dim arg As Integer = attrData.GetConstructorArgument(Of Integer)(i, SpecialType.System_Int32) If arg < 0 Then - diagnostics.Add(ERRID.ERR_BadAttribute1, If(nodeOpt IsNot Nothing, nodeOpt.ArgumentList.Arguments(i).GetLocation(), NoLocation.Singleton), attrData.AttributeClass) + diagnostics.Add(ERRID.ERR_BadAttribute1, VisualBasicAttributeData.GetArgumentLocation(nodeOpt, i), attrData.AttributeClass) End If Next End Sub diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceFieldSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceFieldSymbol.vb index 0d182e60056ce..e6827cfdcef82 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceFieldSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceFieldSymbol.vb @@ -730,7 +730,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ElseIf attrData.IsTargetAttribute(Me, AttributeDescription.FieldOffsetAttribute) Then Dim offset = attrData.CommonConstructorArguments(0).DecodeValue(Of Integer)(SpecialType.System_Int32) If offset < 0 Then - diagnostics.Add(ERRID.ERR_BadAttribute1, arguments.AttributeSyntaxOpt.ArgumentList.Arguments(0).GetLocation(), attrData.AttributeClass) + diagnostics.Add(ERRID.ERR_BadAttribute1, VisualBasicAttributeData.GetFirstArgumentLocation(arguments.AttributeSyntaxOpt), attrData.AttributeClass) offset = 0 End If diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMethodSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMethodSymbol.vb index fb05b9650cd15..63f4f03001473 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMethodSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMethodSymbol.vb @@ -1651,7 +1651,7 @@ lReportErrorOnTwoTokens: Dim moduleName As String = TryCast(attrData.CommonConstructorArguments(0).ValueInternal, String) If Not MetadataHelpers.IsValidMetadataIdentifier(moduleName) Then - diagnostics.Add(ERRID.ERR_BadAttribute1, arguments.AttributeSyntaxOpt.ArgumentList.Arguments(0).GetLocation(), attrData.AttributeClass) + diagnostics.Add(ERRID.ERR_BadAttribute1, VisualBasicAttributeData.GetFirstArgumentLocation(arguments.AttributeSyntaxOpt), attrData.AttributeClass) End If ' Default value of charset is inherited from the module (only if specified). diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceModuleSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceModuleSymbol.vb index 7d175e19ed26b..adc6afbada207 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceModuleSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceModuleSymbol.vb @@ -1096,7 +1096,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols If attrData.IsTargetAttribute(Me, AttributeDescription.DefaultCharSetAttribute) Then Dim charSet As CharSet = attrData.GetConstructorArgument(Of CharSet)(0, SpecialType.System_Enum) If Not CommonModuleWellKnownAttributeData.IsValidCharSet(charSet) Then - DirectCast(arguments.Diagnostics, BindingDiagnosticBag).Add(ERRID.ERR_BadAttribute1, arguments.AttributeSyntaxOpt.ArgumentList.Arguments(0).GetLocation(), attrData.AttributeClass) + DirectCast(arguments.Diagnostics, BindingDiagnosticBag).Add(ERRID.ERR_BadAttribute1, VisualBasicAttributeData.GetFirstArgumentLocation(arguments.AttributeSyntaxOpt), attrData.AttributeClass) Else arguments.GetOrCreateData(Of CommonModuleWellKnownAttributeData)().DefaultCharacterSet = charSet End If diff --git a/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_StructLayout.vb b/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_StructLayout.vb index 01d8b03f30952..9ea8a80736567 100644 --- a/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_StructLayout.vb +++ b/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_StructLayout.vb @@ -691,6 +691,37 @@ BC30127: Attribute 'FieldOffsetAttribute' is not valid: Incorrect argument value ]]>) End Sub + + Public Sub ExplicitFieldLayout_Errors2() + Dim source = + + + Dim b As Integer +End Class +]]> + + + + CreateCompilationWithMscorlib40(source).AssertTheseDiagnostics( + ~~~~~~~~~~~ +]]>) + End Sub + Public Sub ReadingFromMetadata() Using [module] = ModuleMetadata.CreateFromImage(TestResources.MetadataTests.Invalid.ClassLayout) diff --git a/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_WellKnownAttributes.vb b/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_WellKnownAttributes.vb index b69e66042eb0b..0c138059aa558 100644 --- a/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_WellKnownAttributes.vb +++ b/src/Compilers/VisualBasic/Test/Emit/Attributes/AttributeTests_WellKnownAttributes.vb @@ -1092,6 +1092,37 @@ End Class Diagnostic(ERRID.ERR_BadAttribute1, "EntryPoint:=ChrW(&HDC00) & ChrW(&HD800)").WithArguments("System.Runtime.InteropServices.DllImportAttribute")) End Sub + + Public Sub DllImport_InvalidArgs2() + Dim source = + + + Public Shared Sub F1() + End Sub +End Class +]]> + + + CreateCompilationWithMscorlib40AndVBRuntime(source).AssertTheseDiagnostics( + ~~~~~~~~~ +]]>) + End Sub + Public Sub DllImport_SpecialCharactersInName() Dim source = @@ -2275,7 +2306,6 @@ End Class End Sub) End Sub - Public Sub DllImport_DefaultCharSet_Errors() Dim source = @@ -2296,6 +2326,34 @@ BC30127: Attribute 'DefaultCharSetAttribute' is not valid: Incorrect argument va ]]>) End Sub + + Public Sub DllImport_DefaultCharSet_Errors2() + Dim source = + + + +Namespace System.Runtime.InteropServices + Public Class DefaultCharSetAttribute + Inherits Attribute + + Public Sub New(Optional charSet As CharSet = Integer.MaxValue) + End Sub + End Class +End Namespace +]]> + + + + CreateCompilationWithMscorlib40(source).AssertTheseDiagnostics( + ~~~~~~~~~~~~~~~~~~~~~ +]]>) + End Sub + Public Sub DefaultCharSet_Types() Dim source = @@ -3762,14 +3820,102 @@ end class Dim comp = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(source) - comp.VerifyDiagnostics(Diagnostic(ERRID.ERR_OmittedArgument2, "FileIOPermission").WithArguments("action", "Public Overloads Sub New(action As System.Security.Permissions.SecurityAction)"), - Diagnostic(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, "DirectCast(0, SecurityAction)").WithArguments("MySecurityAttribute", "DirectCast(0, SecurityAction)"), - Diagnostic(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, "DirectCast(11, SecurityAction)").WithArguments("MySecurityAttribute", "DirectCast(11, SecurityAction)"), - Diagnostic(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, "DirectCast(-1, SecurityAction)").WithArguments("MySecurityAttribute", "DirectCast(-1, SecurityAction)"), - Diagnostic(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, "DirectCast(0, SecurityAction)").WithArguments("FileIOPermission", "DirectCast(0, SecurityAction)"), - Diagnostic(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, "DirectCast(11, SecurityAction)").WithArguments("FileIOPermission", "DirectCast(11, SecurityAction)"), - Diagnostic(ERRID.ERR_SecurityAttributeInvalidActionTypeOrMethod, "DirectCast(-1, SecurityAction)").WithArguments("FileIOPermission", "DirectCast(-1, SecurityAction)"), - Diagnostic(ERRID.ERR_InvalidAttributeUsage2, "FileIOPermission").WithArguments("FileIOPermissionAttribute", "Field")) + comp.AssertTheseDiagnostics( + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +BC31214: SecurityAction value 'DirectCast(11, SecurityAction)' is invalid for security attributes applied to a type or a method. + + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +BC31214: SecurityAction value 'DirectCast(-1, SecurityAction)' is invalid for security attributes applied to a type or a method. + + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +BC31214: SecurityAction value 'DirectCast(0, SecurityAction)' is invalid for security attributes applied to a type or a method. + + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +BC31214: SecurityAction value 'DirectCast(11, SecurityAction)' is invalid for security attributes applied to a type or a method. + + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +BC31214: SecurityAction value 'DirectCast(-1, SecurityAction)' is invalid for security attributes applied to a type or a method. + + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +BC30455: Argument not specified for parameter 'action' of 'Public Overloads Sub New(action As SecurityAction)'. + + ~~~~~~~~~~~~~~~~ +BC30662: Attribute 'FileIOPermissionAttribute' cannot be applied to 'Field' because the attribute is not valid on this declaration type. + + ~~~~~~~~~~~~~~~~ +]]>) + End Sub + + + Public Sub TestInvalidSecurityActionErrors_UserDefinedWithOptionalParameterInCtor_PermissionsRequestAction() + Dim source = + + +Class A +End Class +]]> + + + + Dim comp = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(source) + comp.AssertTheseDiagnostics( + ~~~~~~~~~~~~~~~~~~~ +]]>) + End Sub + + + Public Sub TestInvalidSecurityActionErrors_UserDefinedWithOptionalParameterInCtor() + Dim source = + + +Class A +End Class +]]> + + + + Dim comp = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntime(source) + comp.AssertTheseDiagnostics( + ~~~~~~~~~~~~~~~~~~~ +]]>) End Sub @@ -3811,14 +3957,26 @@ end class Dim comp = CompilationUtils.CreateCompilationWithMscorlib40AndVBRuntimeAndReferences(source) - comp.VerifyDiagnostics( - Diagnostic(ERRID.ERR_SecurityAttributeMissingAction, "MySecurityAttribute").WithArguments("MySecurityAttribute"), - Diagnostic(ERRID.ERR_SecurityAttributeMissingAction, "MySecurityAttribute").WithArguments("MySecurityAttribute"), - Diagnostic(ERRID.ERR_SecurityAttributeMissingAction, "MySecurityAttribute").WithArguments("MySecurityAttribute"), - Diagnostic(ERRID.ERR_SecurityAttributeMissingAction, "MySecurityAttribute").WithArguments("MySecurityAttribute"), - Diagnostic(ERRID.ERR_SecurityAttributeMissingAction, "MySecurityAttribute").WithArguments("MySecurityAttribute"), - Diagnostic(ERRID.ERR_SecurityAttributeMissingAction, "MySecurityAttribute").WithArguments("MySecurityAttribute") - ) + comp.AssertTheseDiagnostics( + ~~~~~~~~~~~~~~~~~~~ +BC31211: First argument to a security attribute must be a valid SecurityAction. + + ~~~~~~~~~~~~~~~~~~~ +BC31211: First argument to a security attribute must be a valid SecurityAction. + + ~~~~~~~~~~~~~~~~~~~ +BC31211: First argument to a security attribute must be a valid SecurityAction. + + ~~~~~~~~~~~~~~~~~~~ +BC31211: First argument to a security attribute must be a valid SecurityAction. + + ~~~~~~~~~~~~~~~~~~~ +BC31211: First argument to a security attribute must be a valid SecurityAction. + + ~~~~~~~~~~~~~~~~~~~ +]]>) End Sub @@ -3895,6 +4053,40 @@ end class Diagnostic(ERRID.ERR_SecurityAttributeInvalidActionAssembly, "SecurityAction.PermitOnly").WithArguments("SecurityAction.PermitOnly")) End Sub + + Public Sub TestInvalidSecurityActionsForAssemblyErrors_UserDefinedWithOptionalParameterInCtor() + Dim source = + + + +Class MySecurityAttribute + Inherits SecurityAttribute + + Public Sub New (Optional a As SecurityAction = 1) + MyBase.New(a) + End Sub + + Public Overrides Function CreatePermission() As IPermission + Return Nothing + End Function +End Class + +]]> + + + + Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(source) + compilation.AssertTheseDiagnostics( + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +]]>) + End Sub + Public Sub TestInvalidSecurityActionForTypeOrMethod() Dim source = @@ -4042,6 +4234,45 @@ End Class Diagnostic(ERRID.ERR_PrincipalPermissionInvalidAction, "SecurityAction.LinkDemand").WithArguments("SecurityAction.LinkDemand")) End Sub + + + Public Sub PrincipalPermissionAttribute_UserDefinedWithOptionalParameterInCtor() + Dim source = + + + Public Shared Sub Main() + End Sub +End Class +]]> + + + + Dim comp = CreateCompilationWithMscorlib40(source) + comp.AssertTheseDiagnostics( + ~~~~~~~~~~~~~~~~~~~ +]]>) + End Sub + Public Sub SuppressUnmanagedCodeSecurityAttribute() @@ -4268,6 +4499,36 @@ BC30662: Attribute 'ClassInterfaceAttribute' cannot be applied to 'InvalidTarget ]]>) End Sub + + Public Sub TestClassInterfaceAttribute_UserDefinedWithOptionalParameterInCtor() + Dim source = + + +Public Class InvalidClass +End Class +]]> + + + + Dim comp = CreateCompilationWithMscorlib40(source) + comp.AssertTheseDiagnostics( + ~~~~~~~~~~~~~~ +]]>) + End Sub #End Region #Region "InterfaceTypeAttribute, TypeLibTypeAttribute" @@ -4370,6 +4631,37 @@ BC30662: Attribute 'InterfaceTypeAttribute' cannot be applied to 'InvalidTarget' ]]>) End Sub + + Public Sub TestInterfaceTypeAttribute_UserDefinedWithOptionalParameterInCtor() + Dim source = + + +Public Interface InvalidInterface1 +End Interface +]]> + + + + Dim comp = CreateCompilationWithMscorlib40(source) + comp.AssertTheseDiagnostics( + ~~~~~~~~~~~~~ +]]>) + End Sub + Public Sub TestIsExtensibleInterface() @@ -4712,6 +5004,214 @@ BC30934: Conversion from 'String' to 'Integer' cannot occur in a constant expres ]]>) End Sub + + Public Sub TestTypeLibVersionAttribute_Invalid_03() + Dim source = + + ' Not valid. Both arguments are negative. + +Namespace System.Runtime.InteropServices + Public Class TypeLibVersionAttribute + Inherits Attribute + + Public Sub New(Optional major As Integer = -1, Optional minor As Integer = Integer.MinValue) + End Sub + End Class +End Namespace +]]> + + + + Dim comp = CreateCompilationWithMscorlib40(source) + comp.AssertTheseDiagnostics( ' Not valid. Both arguments are negative. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +BC30127: Attribute 'TypeLibVersionAttribute' is not valid: Incorrect argument value. + ' Not valid. Both arguments are negative. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +]]>) + End Sub + + + Public Sub TestTypeLibVersionAttribute_Invalid_04() + Dim source = + + ' Not valid. minor is negative. + +Namespace System.Runtime.InteropServices + Public Class TypeLibVersionAttribute + Inherits Attribute + + Public Sub New(Optional major As Integer = -1, Optional minor As Integer = Integer.MinValue) + End Sub + End Class +End Namespace +]]> + + + + Dim comp = CreateCompilationWithMscorlib40(source) + comp.AssertTheseDiagnostics( ' Not valid. minor is negative. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +]]>) + End Sub + + + Public Sub TestTypeLibVersionAttribute_Invalid_05() + Dim source = + + ' Not valid. Both arguments are negative. + +Namespace System.Runtime.InteropServices + Public Class TypeLibVersionAttribute + Inherits Attribute + + Public Sub New(Optional major As Integer = -1, Optional minor As Integer = Integer.MinValue) + End Sub + End Class +End Namespace +]]> + + + + Dim comp = CreateCompilationWithMscorlib40(source) + comp.AssertTheseDiagnostics( ' Not valid. Both arguments are negative. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +BC30127: Attribute 'TypeLibVersionAttribute' is not valid: Incorrect argument value. + ' Not valid. Both arguments are negative. + ~~ +]]>) + End Sub + + + Public Sub TestTypeLibVersionAttribute_Invalid_06() + Dim source = + + ' Not valid. Both arguments are negative. + +Namespace System.Runtime.InteropServices + Public Class TypeLibVersionAttribute + Inherits Attribute + + Public Sub New(Optional major As Integer = -1, Optional minor As Integer = Integer.MinValue) + End Sub + End Class +End Namespace +]]> + + + + Dim comp = CreateCompilationWithMscorlib40(source) + comp.AssertTheseDiagnostics( ' Not valid. Both arguments are negative. + ~~ +BC30127: Attribute 'TypeLibVersionAttribute' is not valid: Incorrect argument value. + ' Not valid. Both arguments are negative. + ~~ +]]>) + End Sub + + + Public Sub TestTypeLibVersionAttribute_Invalid_07() + Dim source = + + ' Not valid. major is negative. + +Namespace System.Runtime.InteropServices + Public Class TypeLibVersionAttribute + Inherits Attribute + + Public Sub New(Optional major As Integer = -1, Optional minor As Integer = Integer.MinValue) + End Sub + End Class +End Namespace +]]> + + + + Dim comp = CreateCompilationWithMscorlib40(source) + comp.AssertTheseDiagnostics( ' Not valid. major is negative. + ~~ +]]>) + End Sub + + + Public Sub TestTypeLibVersionAttribute_Invalid_08() + Dim source = + + ' Not valid. minor is negative. + +Namespace System.Runtime.InteropServices + Public Class TypeLibVersionAttribute + Inherits Attribute + + Public Sub New(Optional major As Integer = -1, Optional minor As Integer = Integer.MinValue) + End Sub + End Class +End Namespace +]]> + + + + Dim comp = CreateCompilationWithMscorlib40(source) + comp.AssertTheseDiagnostics( ' Not valid. minor is negative. + ~~ +]]>) + End Sub + + + Public Sub TestTypeLibVersionAttribute_Valid_UserDefinedAttribute() + Dim source = + + + +Namespace System.Runtime.InteropServices + Public Class TypeLibVersionAttribute + Inherits Attribute + + Public Sub New(Optional major As Integer = -1, Optional minor As Integer = Integer.MinValue) + End Sub + End Class +End Namespace +]]> + + + + Dim comp = CreateCompilationWithMscorlib40(source) + comp.AssertTheseDiagnostics() + End Sub + #End Region #Region "ComCompatibleVersionAttribute" @@ -6676,5 +7176,36 @@ BC30127: Attribute 'StructLayoutAttribute' is not valid: Incorrect argument valu ]]> ) End Sub + + + Public Sub TestGuidAttribute() + Dim source = + + +Public Class AClass +End Class +]]> + + + + Dim compilation = CreateCompilationWithMscorlib40AndVBRuntime(source) + compilation.AssertTheseDiagnostics( + ~~~~ +]]>) + End Sub End Class End Namespace