diff --git a/mcs/errors/cs1519-5.cs b/mcs/errors/cs1519-5.cs new file mode 100644 index 0000000000000..0ebf40667ed8c --- /dev/null +++ b/mcs/errors/cs1519-5.cs @@ -0,0 +1,7 @@ +// CS1519: Unexpected symbol `}' in class, struct, or interface member declaration +// Line: 7 + +public class Foo +{ + public f +} \ No newline at end of file diff --git a/mcs/mcs/cs-parser.jay b/mcs/mcs/cs-parser.jay index eeadc8039b6cb..c65a7ae5e72bc 100644 --- a/mcs/mcs/cs-parser.jay +++ b/mcs/mcs/cs-parser.jay @@ -901,13 +901,14 @@ class_member_declaration | destructor_declaration | type_declaration | attributes_without_members + | incomplete_member | error { report.Error (1519, lexer.Location, "Unexpected symbol `{0}' in class, struct, or interface member declaration", GetSymbolName (yyToken)); $$ = null; lexer.parsing_generic_declaration = false; - } + } ; struct_declaration @@ -2526,6 +2527,23 @@ attributes_without_members lexer.putback ('}'); } ; + +// For full ast try to recover incomplete ambiguous member +// declaration in form on class X { public int } +incomplete_member + : opt_attributes opt_modifiers member_type CLOSE_BRACE + { + report.Error (1519, lexer.Location, "Unexpected symbol `}' in class, struct, or interface member declaration"); + + lexer.putback ('}'); + + lexer.parsing_generic_declaration = false; + FullNamedExpression type = (FullNamedExpression) $3; + current_field = new Field (current_type, type, (Modifiers) $2, MemberName.Null, (Attributes) $1); + current_type.AddField (current_field); + $$ = current_field; + } + ; enum_declaration : opt_attributes