From 1a6b2f0d18388a260c560f886397a7a3f3e6f80a Mon Sep 17 00:00:00 2001 From: VSadov Date: Thu, 5 Mar 2015 12:43:50 -0800 Subject: [PATCH] Restored requirement for struct constructors to always have formal parameters Fixes #1029 While overall parameterless constructors in structs are valid from IL perspective, without a convenient way to declare them they were virtually nonexistent. As we performed more and more testing, we kept discovering cases where parameterless struct constructors caused inconsistent behavior in libraries or even in some versions of CLR. After reconsidering the potential issues arising from breaking long standing assumptions, we decided it was best for our users to restore the requirement on struct constructors to always have formal parameters. --- .../Portable/CSharpResources.Designer.cs | 18 -- .../CSharp/Portable/CSharpResources.resx | 6 - .../CSharp/Portable/Errors/ErrorCode.cs | 2 +- .../CSharp/Portable/Errors/MessageID.cs | 3 +- .../Source/SourceMemberContainerSymbol.cs | 6 +- .../CodeGen/CodeGenConstructorInitTests.cs | 156 +-------------- .../FlowAnalysis/FlowDiagnosticTests.cs | 8 +- .../Test/Semantic/Semantics/ConstantTests.cs | 3 + .../Test/Semantic/Semantics/StructsTests.cs | 10 +- .../Symbol/Symbols/Source/PropertyTests.cs | 10 +- .../Test/Symbol/Symbols/SymbolErrorTests.cs | 33 +--- .../VisualBasic/Portable/Errors/Errors.vb | 2 +- .../Symbols/Source/SourceMethodSymbol.vb | 11 +- .../Portable/VBResources.Designer.vb | 11 +- .../VisualBasic/Portable/VBResources.resx | 5 +- .../Emit/CodeGen/CodeGenCtorInitializers.vb | 180 +----------------- .../Test/Emit/CodeGen/CodeGenVBCore.vb | 6 +- .../Symbol/SymbolsTests/Source/TypeTests.vb | 4 +- .../Symbol/SymbolsTests/SymbolErrorTests.vb | 4 +- 19 files changed, 49 insertions(+), 429 deletions(-) diff --git a/src/Compilers/CSharp/Portable/CSharpResources.Designer.cs b/src/Compilers/CSharp/Portable/CSharpResources.Designer.cs index 6b6d2b5fc8629..401c0d1fc3135 100644 --- a/src/Compilers/CSharp/Portable/CSharpResources.Designer.cs +++ b/src/Compilers/CSharp/Portable/CSharpResources.Designer.cs @@ -6703,15 +6703,6 @@ internal static string ERR_ParameterIsStaticClass { } } - /// - /// Looks up a localized string similar to Parameterless instance constructors in structs must be public. - /// - internal static string ERR_ParameterlessStructCtorsMustBePublic { - get { - return ResourceManager.GetString("ERR_ParameterlessStructCtorsMustBePublic", resourceCulture); - } - } - /// /// Looks up a localized string similar to Parameter not valid for the specified unmanaged type.. /// @@ -9098,15 +9089,6 @@ internal static string IDS_FeatureStaticClasses { } } - /// - /// Looks up a localized string similar to struct instance parameterless constructors. - /// - internal static string IDS_FeatureStructParameterlessConstructors { - get { - return ResourceManager.GetString("IDS_FeatureStructParameterlessConstructors", resourceCulture); - } - } - /// /// Looks up a localized string similar to switch on boolean type. /// diff --git a/src/Compilers/CSharp/Portable/CSharpResources.resx b/src/Compilers/CSharp/Portable/CSharpResources.resx index a340fc370e401..3c9f16b7fd30f 100644 --- a/src/Compilers/CSharp/Portable/CSharpResources.resx +++ b/src/Compilers/CSharp/Portable/CSharpResources.resx @@ -1550,9 +1550,6 @@ If such a class is used as a base class and if the deriving class defines a dest Enums cannot contain explicit parameterless constructors - - Parameterless instance constructors in structs must be public - '{0}': cannot override '{1}' because it is not supported by the language @@ -4553,9 +4550,6 @@ To remove the warning, you can use /reference instead (set the Embed Interop Typ dictionary initializer - - struct instance parameterless constructors - Missing close delimiter '}' for interpolated expression started with '{'. diff --git a/src/Compilers/CSharp/Portable/Errors/ErrorCode.cs b/src/Compilers/CSharp/Portable/Errors/ErrorCode.cs index b2f1506840ef8..6d08d05c749f8 100644 --- a/src/Compilers/CSharp/Portable/Errors/ErrorCode.cs +++ b/src/Compilers/CSharp/Portable/Errors/ErrorCode.cs @@ -1289,7 +1289,7 @@ internal enum ErrorCode ERR_NullPropagatingOpInExpressionTree = 8072, WRN_NubExprIsConstBool2 = 8073, ERR_DictionaryInitializerInExpressionTree = 8074, - ERR_ParameterlessStructCtorsMustBePublic = 8075, + // available: 8075, ERR_UnclosedExpressionHole = 8076, ERR_SingleLineCommentInExpressionHole = 8077, ERR_InsufficientStack = 8078, diff --git a/src/Compilers/CSharp/Portable/Errors/MessageID.cs b/src/Compilers/CSharp/Portable/Errors/MessageID.cs index a1cc81ea25d3f..d2ad4e5dd67cd 100644 --- a/src/Compilers/CSharp/Portable/Errors/MessageID.cs +++ b/src/Compilers/CSharp/Portable/Errors/MessageID.cs @@ -101,7 +101,7 @@ internal enum MessageID // IDS_VersionExperimental = MessageBase + 12694, IDS_FeatureNameof = MessageBase + 12695, IDS_FeatureDictionaryInitializer = MessageBase + 12696, - IDS_FeatureStructParameterlessConstructors = MessageBase + 12697, + // available: MessageBase + 12697, IDS_LogoLine1 = MessageBase + 12698, IDS_LogoLine2 = MessageBase + 12699, @@ -158,7 +158,6 @@ internal static LanguageVersion RequiredVersion(this MessageID feature) case MessageID.IDS_FeatureExpressionBodiedIndexer: case MessageID.IDS_FeatureNameof: case MessageID.IDS_FeatureDictionaryInitializer: - case MessageID.IDS_FeatureStructParameterlessConstructors: case MessageID.IDS_FeatureUsingStatic: case MessageID.IDS_FeatureInterpolatedStrings: return LanguageVersion.CSharp6; diff --git a/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs b/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs index 6410f90e05df4..84bafedd12f0b 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs @@ -2723,13 +2723,9 @@ private static void CheckForStructDefaultConstructors( { diagnostics.Add(ErrorCode.ERR_EnumsCantContainDefaultConstructor, m.Locations[0]); } - else if (m.DeclaredAccessibility != Accessibility.Public) - { - diagnostics.Add(ErrorCode.ERR_ParameterlessStructCtorsMustBePublic, m.Locations[0]); - } else { - Binder.CheckFeatureAvailability(m.Locations[0], MessageID.IDS_FeatureStructParameterlessConstructors, diagnostics); + diagnostics.Add(ErrorCode.ERR_StructsCantContainDefaultConstructor, m.Locations[0]); } } } diff --git a/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenConstructorInitTests.cs b/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenConstructorInitTests.cs index fc0b27d33afe1..7dccc965ca2b5 100644 --- a/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenConstructorInitTests.cs +++ b/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenConstructorInitTests.cs @@ -300,158 +300,6 @@ static void Main(string[] args) CompileAndVerify(text, expectedOutput: expectedOutput); } - - [Fact] - public void ParameterlessConstructorStruct001() - { - var source = @" -class C -{ - struct S1 - { - public readonly int x; - public S1() - { - x = 42; - } - } - - static void Main() - { - var s = new S1(); - System.Console.WriteLine(s.x); - } -} -"; - CompileAndVerify(source, expectedOutput: "42"). - VerifyIL("C.S1..ctor", @" -{ - // Code size 9 (0x9) - .maxstack 2 - IL_0000: ldarg.0 - IL_0001: ldc.i4.s 42 - IL_0003: stfld ""int C.S1.x"" - IL_0008: ret -} -"); - } - - [Fact] - public void ParameterlessConstructorStruct002() - { - var source = @" -class C -{ - struct S1 - { - public readonly int x; - public S1() - { - x = 42; - } - - public S1(int a):this() - { - } - } - - static void Main() - { - var s = new S1(123); - System.Console.WriteLine(s.x); - } -} -"; - CompileAndVerify(source, expectedOutput: "42"). - VerifyIL("C.S1..ctor(int)", @" -{ - // Code size 7 (0x7) - .maxstack 1 - IL_0000: ldarg.0 - IL_0001: call ""C.S1..ctor()"" - IL_0006: ret -} -"); - } - - [Fact] - public void ParameterlessConstructorStruct003() - { - var source = @" -class C -{ - struct S1 - { - public readonly int x; - public S1(): this(42) - { - } - - public S1(int a) - { - x = a; - } - } - - static void Main() - { - var s = new S1(); - System.Console.WriteLine(s.x); - } -} -"; - CompileAndVerify(source, expectedOutput: "42"). - VerifyIL("C.S1..ctor(int)", @" -{ - // Code size 8 (0x8) - .maxstack 2 - IL_0000: ldarg.0 - IL_0001: ldarg.1 - IL_0002: stfld ""int C.S1.x"" - IL_0007: ret -} -"). -VerifyIL("C.S1..ctor()", @" -{ - // Code size 9 (0x9) - .maxstack 2 - IL_0000: ldarg.0 - IL_0001: ldc.i4.s 42 - IL_0003: call ""C.S1..ctor(int)"" - IL_0008: ret -} -"); - } - - [Fact] - public void ParameterlessInstCtorInStructExprTree() - { - var source = @" - -using System; -using System.Linq.Expressions; - -class C -{ - struct S1 - { - public int x; - public S1() - { - x = 42; - } - } - - static void Main() - { - Expression> testExpr = () => new S1(); - System.Console.Write(testExpr.Compile()().x); - } -} -"; - CompileAndVerify(source, additionalRefs: new[] { ExpressionAssemblyRef }, expectedOutput: "42"); - } - [Fact] public void TestInitializerInCtor001() { @@ -496,7 +344,7 @@ public struct S public int X{get;} public int Y{get;} - public S() + public S(int dummy) { X = 42; Y = X; @@ -504,7 +352,7 @@ public S() public static void Main() { - S s = new S(); + S s = new S(1); System.Console.WriteLine(s.Y); } } diff --git a/src/Compilers/CSharp/Test/Semantic/FlowAnalysis/FlowDiagnosticTests.cs b/src/Compilers/CSharp/Test/Semantic/FlowAnalysis/FlowDiagnosticTests.cs index 3dba06db2d5e5..0437946b88e2d 100644 --- a/src/Compilers/CSharp/Test/Semantic/FlowAnalysis/FlowDiagnosticTests.cs +++ b/src/Compilers/CSharp/Test/Semantic/FlowAnalysis/FlowDiagnosticTests.cs @@ -1315,7 +1315,7 @@ struct S1 S1 x2 { get; } - public Program() + public Program(int dummy) { x.i = 1; System.Console.WriteLine(x2.ii); @@ -1364,7 +1364,7 @@ struct S1 S1 x2 { get; set;} - public Program() + public Program(int dummy) { x.i = 1; System.Console.WriteLine(x2.ii); @@ -1413,7 +1413,7 @@ struct S1 S1 x2 { get;} - public Program() + public Program(int dummy) { x = new S1(); x.i += 1; @@ -1459,7 +1459,7 @@ struct S1 S1 x2 { get;} - public Program() + public Program(int dummy) { this = default(Program); diff --git a/src/Compilers/CSharp/Test/Semantic/Semantics/ConstantTests.cs b/src/Compilers/CSharp/Test/Semantic/Semantics/ConstantTests.cs index 610dc6bb7f2b4..a23e73b995083 100644 --- a/src/Compilers/CSharp/Test/Semantic/Semantics/ConstantTests.cs +++ b/src/Compilers/CSharp/Test/Semantic/Semantics/ConstantTests.cs @@ -178,6 +178,9 @@ static void Main(string[] args) "; var comp = CreateExperimentalCompilationWithMscorlib45(source); comp.VerifyDiagnostics( + // (10,12): error CS0568: Structs cannot contain explicit parameterless constructors + // public S2() + Diagnostic(ErrorCode.ERR_StructsCantContainDefaultConstructor, "S2").WithLocation(10, 12), // (26,28): error CS1736: Default parameter value for 's' must be a compile-time constant // static void Foo(S2 s = new S2()) Diagnostic(ErrorCode.ERR_DefaultValueMustBeConstant, "new S2()").WithArguments("s").WithLocation(26, 28) diff --git a/src/Compilers/CSharp/Test/Semantic/Semantics/StructsTests.cs b/src/Compilers/CSharp/Test/Semantic/Semantics/StructsTests.cs index edc2293f588c0..8535138325251 100644 --- a/src/Compilers/CSharp/Test/Semantic/Semantics/StructsTests.cs +++ b/src/Compilers/CSharp/Test/Semantic/Semantics/StructsTests.cs @@ -603,12 +603,12 @@ public struct X1 "; CreateExperimentalCompilationWithMscorlib45(source).VerifyDiagnostics( - // (4,13): error CS8075: Parameterless struct constructors must be public - // private X() - Diagnostic(ErrorCode.ERR_ParameterlessStructCtorsMustBePublic, "X").WithLocation(4, 13), - // (11,5): error CS8075: Parameterless struct constructors must be public + // (11,5): error CS0568: Structs cannot contain explicit parameterless constructors // X1() - Diagnostic(ErrorCode.ERR_ParameterlessStructCtorsMustBePublic, "X1").WithLocation(11, 5) + Diagnostic(ErrorCode.ERR_StructsCantContainDefaultConstructor, "X1").WithLocation(11, 5), + // (4,13): error CS0568: Structs cannot contain explicit parameterless constructors + // private X() + Diagnostic(ErrorCode.ERR_StructsCantContainDefaultConstructor, "X").WithLocation(4, 13) ); } } diff --git a/src/Compilers/CSharp/Test/Symbol/Symbols/Source/PropertyTests.cs b/src/Compilers/CSharp/Test/Symbol/Symbols/Source/PropertyTests.cs index 670fae05df2ea..5eaab87e26aff 100644 --- a/src/Compilers/CSharp/Test/Symbol/Symbols/Source/PropertyTests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Symbols/Source/PropertyTests.cs @@ -118,12 +118,15 @@ public void M() } ").VerifyDiagnostics( - // (27,9): error CS0200: Property or indexer 'S.Ps' cannot be assigned to -- it is read only - // Ps = 5; - Diagnostic(ErrorCode.ERR_AssgReadonlyProp, "Ps").WithArguments("S.Ps").WithLocation(27, 9), + // (24,12): error CS0568: Structs cannot contain explicit parameterless constructors + // public S() + Diagnostic(ErrorCode.ERR_StructsCantContainDefaultConstructor, "S").WithLocation(24, 12), // (9,9): error CS0200: Property or indexer 'C.Ps' cannot be assigned to -- it is read only // Ps = 3; Diagnostic(ErrorCode.ERR_AssgReadonlyProp, "Ps").WithArguments("C.Ps").WithLocation(9, 9), + // (27,9): error CS0200: Property or indexer 'S.Ps' cannot be assigned to -- it is read only + // Ps = 5; + Diagnostic(ErrorCode.ERR_AssgReadonlyProp, "Ps").WithArguments("S.Ps").WithLocation(27, 9), // (14,9): error CS0200: Property or indexer 'C.P' cannot be assigned to -- it is read only // P = 10; Diagnostic(ErrorCode.ERR_AssgReadonlyProp, "P").WithArguments("C.P").WithLocation(14, 9), @@ -136,6 +139,7 @@ public void M() // (33,9): error CS0200: Property or indexer 'S.Ps' cannot be assigned to -- it is read only // S.Ps = 1; Diagnostic(ErrorCode.ERR_AssgReadonlyProp, "S.Ps").WithArguments("S.Ps").WithLocation(33, 9) + ); } diff --git a/src/Compilers/CSharp/Test/Symbol/Symbols/SymbolErrorTests.cs b/src/Compilers/CSharp/Test/Symbol/Symbols/SymbolErrorTests.cs index ece4685a86fd8..6d8436685ba61 100644 --- a/src/Compilers/CSharp/Test/Symbol/Symbols/SymbolErrorTests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Symbols/SymbolErrorTests.cs @@ -10100,29 +10100,6 @@ interface IA ); } - [Fact] - public void CS0568ERR_StructsCantContainDefaultConstructor01() - { - var text = @"namespace NS -{ - public struct S1 - { - public S1() {} - - struct S2 - { - S2() { } - } - } -} -"; - var comp = DiagnosticsUtils.VerifyErrorsAndGetCompilationWithMscorlib(text, - new ErrorDescription { Code = (int)ErrorCode.ERR_ParameterlessStructCtorsMustBePublic, Line = 9, Column = 13 }); - - var ns = comp.SourceModule.GlobalNamespace.GetMembers("NS").Single() as NamespaceSymbol; - // TODO... - } - [Fact] public void CS0569ERR_CantOverrideBogusMethod() { @@ -10207,7 +10184,7 @@ public struct cly } [Fact] - public void InstanceCtorInsTructPre60() + public void CS0568ERR_StructsCantContainDefaultConstructor01() { var text = @"namespace x { @@ -10224,12 +10201,12 @@ struct S2 "; var comp = CreateCompilationWithMscorlib(text, parseOptions: TestOptions.Regular.WithLanguageVersion(LanguageVersion.CSharp5)); comp.VerifyDiagnostics( - // (5,16): error CS8026: Feature 'struct instance parameterless constructors' is not available in C# 5. Please use language version 6 or greater. + // (5,16): error CS0568: Structs cannot contain explicit parameterless constructors // public S1() {} - Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion5, "S1").WithArguments("struct instance parameterless constructors", "6").WithLocation(5, 16), - // (9,13): error CS8075: Parameterless instance constructors in structs must be public + Diagnostic(ErrorCode.ERR_StructsCantContainDefaultConstructor, "S1").WithLocation(5, 16), + // (9,13): error CS0568: Structs cannot contain explicit parameterless constructors // S2() { } - Diagnostic(ErrorCode.ERR_ParameterlessStructCtorsMustBePublic, "S2").WithLocation(9, 13) + Diagnostic(ErrorCode.ERR_StructsCantContainDefaultConstructor, "S2").WithLocation(9, 13) ); } diff --git a/src/Compilers/VisualBasic/Portable/Errors/Errors.vb b/src/Compilers/VisualBasic/Portable/Errors/Errors.vb index a4d3f9814f3f3..d8771a380381a 100644 --- a/src/Compilers/VisualBasic/Portable/Errors/Errors.vb +++ b/src/Compilers/VisualBasic/Portable/Errors/Errors.vb @@ -1667,7 +1667,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic ERR_NullPropagatingOpInExpressionTree = 37240 ERR_TooLongOrComplexExpression = 37241 - ERR_StructParameterlessInstanceCtorMustBePublic = 37242 + ' available: 37242 ERR_AutoPropertyCantBeWriteOnly = 37243 ERR_ExpressionDoesntHaveName = 37244 diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMethodSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMethodSymbol.vb index d6f4a4e72f0bd..c2c62ce24954b 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMethodSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMethodSymbol.vb @@ -399,15 +399,8 @@ lReportErrorOnTwoTokens: If (flags And SourceMemberFlags.Shared) = 0 Then If container.TypeKind = TypeKind.Structure AndAlso methodSym.ParameterCount = 0 Then - If binder.Compilation.LanguageVersion < LanguageVersion.VisualBasic14 Then - ' Instance constructor must have parameters. - Binder.ReportDiagnostic(diagBag, syntax.NewKeyword, ERRID.ERR_NewInStruct) - Else - If methodSym.DeclaredAccessibility <> Accessibility.Public Then - ' Instance constructor must be public. - Binder.ReportDiagnostic(diagBag, syntax.NewKeyword, ERRID.ERR_StructParameterlessInstanceCtorMustBePublic) - End If - End If + ' Instance constructor must have parameters. + Binder.ReportDiagnostic(diagBag, syntax.NewKeyword, ERRID.ERR_NewInStruct) End If End If diff --git a/src/Compilers/VisualBasic/Portable/VBResources.Designer.vb b/src/Compilers/VisualBasic/Portable/VBResources.Designer.vb index 4780376195659..247e271910ca0 100644 --- a/src/Compilers/VisualBasic/Portable/VBResources.Designer.vb +++ b/src/Compilers/VisualBasic/Portable/VBResources.Designer.vb @@ -7693,7 +7693,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic End Property ''' - ''' Looks up a localized string similar to The feature 'Parameterless Instance Constructors in Structures' requires language version 14 or above.. + ''' Looks up a localized string similar to Structures cannot declare a non-shared 'Sub New' with no parameters.. ''' Friend ReadOnly Property ERR_NewInStruct() As String Get @@ -9928,15 +9928,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic End Get End Property - ''' - ''' Looks up a localized string similar to Parameterless instance constructors in structures must be public.. - ''' - Friend ReadOnly Property ERR_StructParameterlessInstanceCtorMustBePublic() As String - Get - Return ResourceManager.GetString("ERR_StructParameterlessInstanceCtorMustBePublic", resourceCulture) - End Get - End Property - ''' ''' Looks up a localized string similar to Methods declared in structures cannot have 'Handles' clauses.. ''' diff --git a/src/Compilers/VisualBasic/Portable/VBResources.resx b/src/Compilers/VisualBasic/Portable/VBResources.resx index 26b912557210c..d99812a6dee5a 100644 --- a/src/Compilers/VisualBasic/Portable/VBResources.resx +++ b/src/Compilers/VisualBasic/Portable/VBResources.resx @@ -1359,7 +1359,7 @@ Structures cannot have 'Inherits' statements. - The feature 'Parameterless Instance Constructors in Structures' requires language version 14 or above. + Structures cannot declare a non-shared 'Sub New' with no parameters. 'End Get' must be preceded by a matching 'Get'. @@ -5208,9 +5208,6 @@ A null propagating operator cannot be converted into an expression tree. - - Parameterless instance constructors in structures must be public. - An expression is too long or complex to compile diff --git a/src/Compilers/VisualBasic/Test/Emit/CodeGen/CodeGenCtorInitializers.vb b/src/Compilers/VisualBasic/Test/Emit/CodeGen/CodeGenCtorInitializers.vb index aec14089a2302..2d5b3c9adb74c 100644 --- a/src/Compilers/VisualBasic/Test/Emit/CodeGen/CodeGenCtorInitializers.vb +++ b/src/Compilers/VisualBasic/Test/Emit/CodeGen/CodeGenCtorInitializers.vb @@ -9,141 +9,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests Public Class CodeGenStructCtor Inherits BasicTestBase - - Public Sub ParameterlessCtor001() - CompileAndVerify( - - -Imports System - -Structure S1 - Public x as integer - Public y as integer - - public Sub New() - x = 42 - end sub - - public Sub New(dummy as integer) - end sub - -end structure - -Module M1 - Sub Main() - dim s as new S1() - Console.WriteLine(s.x) - - s.y = 333 - s = new S1() - Console.WriteLine(s.y) - - s = new S1(3) - Console.WriteLine(s.x) - Console.WriteLine(s.y) - - End Sub -End Module - - -, -expectedOutput:=).VerifyIL("S1..ctor()", - ).VerifyIL("S1..ctor(Integer)", - ) - End Sub - - - Public Sub ParameterlessCtor002() - CompileAndVerify( - - -Imports System - -Structure S1 - Public x as integer - Public y as integer - - public Sub New() - x = 42 - end sub - - public Sub New(dummy as integer) - Me.New - end sub - -end structure - -Module M1 - Sub Main() - dim s as new S1() - Console.WriteLine(s.x) - - s.y = 333 - s = new S1() - Console.WriteLine(s.y) - - s = new S1(3) - Console.WriteLine(s.x) - Console.WriteLine(s.y) - - End Sub -End Module - - -, -expectedOutput:=).VerifyIL("S1..ctor()", - ).VerifyIL("S1..ctor(Integer)", - ) - End Sub - Public Sub ParameterlessCtor003() CompileAndVerify( @@ -207,39 +72,6 @@ expectedOutput:=) End Sub - - Public Sub ParameterlessCtor004() - Dim source = - - -Imports System -Imports System.Linq.Expressions - -Structure S1 - Public x as integer - Public y as integer - - public Sub New() - x = 42 - end sub -end structure - -Module M1 - Sub Main() - Dim testExpr as Expression(of Func(of S1)) = Function()new S1() - System.Console.Write(testExpr.Compile()().x) - End Sub -End Module - - - - - Dim compilation = CreateCompilationWithMscorlibAndVBRuntimeAndReferences(source, {SystemCoreRef}, options:=TestOptions.ReleaseExe) - - Dim verifier = CompileAndVerify(compilation, ) - - End Sub - Public Sub ReadOnlyAutopropInCtor001() CompileAndVerify( @@ -330,14 +162,14 @@ Module Program Structure c1 Public readonly Property p1 As Integer Public readonly Property p2 As Integer - Public Sub New() + Public Sub New(dummy as integer) p1 = 42 p2 = p1 End Sub End Structure Sub Main(args As String()) - Dim c As New c1 + Dim c As New c1(1) System.Console.WriteLine(c.p2) End Sub End Module @@ -345,7 +177,7 @@ End Module , expectedOutput:= - ).VerifyIL("Program.c1..ctor()", + ).VerifyIL("Program.c1..ctor(Integer)", Module Program Structure c1 Public readonly Property p1 As Integer - Public Sub New() + Public Sub New(dummy as integer) p1 += 42 End Sub End Structure Sub Main(args As String()) - Dim c As New c1 + Dim c As New c1(1) System.Console.WriteLine(c.p1) End Sub End Module @@ -464,7 +296,7 @@ End Module , expectedOutput:= - ).VerifyIL("Program.c1..ctor()", + ).VerifyIL("Program.c1..ctor(Integer)", diff --git a/src/Compilers/VisualBasic/Test/Symbol/SymbolsTests/SymbolErrorTests.vb b/src/Compilers/VisualBasic/Test/Symbol/SymbolsTests/SymbolErrorTests.vb index e66f07696281b..a21eef650b5f4 100644 --- a/src/Compilers/VisualBasic/Test/Symbol/SymbolsTests/SymbolErrorTests.vb +++ b/src/Compilers/VisualBasic/Test/Symbol/SymbolsTests/SymbolErrorTests.vb @@ -6551,7 +6551,7 @@ BC30628: Structures cannot have 'Inherits' statements. ]]> , parseOptions:=TestOptions.Regular.WithLanguageVersion(LanguageVersion.VisualBasic12)) Dim expectedErrors1 = @@ -6576,7 +6576,7 @@ BC30629: The feature 'Parameterless Instance Constructors in Structures' require ]]> ) Dim expectedErrors1 =