From b168a821cbd5c28237acc0b8e30711a5db592b8e Mon Sep 17 00:00:00 2001 From: AlekseyTs Date: Tue, 16 Dec 2014 10:45:38 -0800 Subject: [PATCH] C#: Disallow field-like event initializers in structs. Fixes #343. ***NO_CI*** (changeset 1387165) --- .../Source/SourceMemberContainerSymbol.cs | 25 ++-------- .../Test/Semantic/Semantics/StructsTests.cs | 46 +++++++++++++++++++ 2 files changed, 51 insertions(+), 20 deletions(-) diff --git a/Src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs b/Src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs index bc8529907c9..b384df1499a 100644 --- a/Src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs +++ b/Src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs @@ -2648,28 +2648,13 @@ private static void CheckInterfaceMember(Symbol member, DiagnosticBag diagnostic private void CheckForStructBadInitializers(MembersAndInitializersBuilder builder, DiagnosticBag diagnostics) { Debug.Assert(TypeKind == TypeKind.Struct); - if (builder.InstanceInitializers.Count > 0) - { - var members = builder.NonTypeNonIndexerMembers; - foreach (var s in members) + foreach (var initializers in builder.InstanceInitializers) + { + foreach (FieldOrPropertyInitializer initializer in initializers) { - var p = s as SourcePropertySymbol; - if (p != null && !p.IsStatic && p.IsAutoProperty - && p.BackingField.HasInitializer) - { - // '{0}': cannot have instance field initializers in structs - diagnostics.Add(ErrorCode.ERR_FieldInitializerInStruct, p.Locations[0], this); - } - else - { - var f = s as SourceMemberFieldSymbol; - if (f != null && !f.IsStatic && f.HasInitializer) - { - // '{0}': cannot have instance field initializers in structs - diagnostics.Add(ErrorCode.ERR_FieldInitializerInStruct, f.Locations[0], this); - } - } + // '{0}': cannot have instance field initializers in structs + diagnostics.Add(ErrorCode.ERR_FieldInitializerInStruct, (initializer.Field.AssociatedSymbol ?? initializer.Field).Locations[0], this); } } } diff --git a/Src/Compilers/CSharp/Test/Semantic/Semantics/StructsTests.cs b/Src/Compilers/CSharp/Test/Semantic/Semantics/StructsTests.cs index 344d816116f..4984be85c7a 100644 --- a/Src/Compilers/CSharp/Test/Semantic/Semantics/StructsTests.cs +++ b/Src/Compilers/CSharp/Test/Semantic/Semantics/StructsTests.cs @@ -38,6 +38,52 @@ public struct A ); } + [WorkItem(1075325, "DevDiv"), WorkItem(343, "CodePlex")] + [Fact()] + public void TestInitEventStruct() + { + var text = @" +struct S { + event System.Action E = null; + + void M() + { + E(); + } +} +"; + CreateCompilationWithMscorlib(text).VerifyDiagnostics( + // (3,25): error CS0573: 'S': cannot have instance property or field initializers in structs + // event System.Action E = null; + Diagnostic(ErrorCode.ERR_FieldInitializerInStruct, "E").WithArguments("S").WithLocation(3, 25) + ); + } + + [WorkItem(1075325, "DevDiv"), WorkItem(343, "CodePlex")] + [Fact()] + public void TestStaticInitInStruct() + { + var text = @" +struct S { + static event System.Action E = M; + static int F = 10; + static int P {get; set;} = 20; + + static void M() + { + } + + static void Main() + { + System.Console.WriteLine(""{0} {1} {2}"", S.F, S.P, S.E == null); + } +} +"; + var comp = CreateCompilationWithMscorlib(text, options: TestOptions.DebugExe); + + CompileAndVerify(comp, expectedOutput: "10 20 False").VerifyDiagnostics(); + } + // Test constructor forwarding works for structs [WorkItem(540896, "DevDiv")] [Fact] -- GitLab