From: Rico Tzschichholz Date: Mon, 18 Mar 2024 11:12:14 +0000 (+0100) Subject: parser: Perform proper checks of symbol modifiers X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7d405900242ff5ef96abe7b117ec4e65dc058858;p=thirdparty%2Fvala.git parser: Perform proper checks of symbol modifiers --- diff --git a/vala/valaparser.vala b/vala/valaparser.vala index 116ca8a6a..af1c4534a 100644 --- a/vala/valaparser.vala +++ b/vala/valaparser.vala @@ -2981,7 +2981,7 @@ public class Vala.Parser : CodeVisitor { void parse_class_declaration (Symbol parent, List? attrs, bool partial_reparse = false) throws ParseError { var begin = get_location (); var access = parse_access_modifier (); - var flags = parse_type_declaration_modifiers (); + var flags = parse_type_declaration_modifiers ("classes", ModifierFlags.ABSTRACT | ModifierFlags.EXTERN | ModifierFlags.PARTIAL | ModifierFlags.SEALED); expect (TokenType.CLASS); var sym = parse_symbol_name (); var type_param_list = parse_type_parameter_list (); @@ -3498,7 +3498,7 @@ public class Vala.Parser : CodeVisitor { void parse_struct_declaration (Symbol parent, List? attrs) throws ParseError { var begin = get_location (); var access = parse_access_modifier (); - var flags = parse_type_declaration_modifiers (); + var flags = parse_type_declaration_modifiers ("structs", ModifierFlags.EXTERN); expect (TokenType.STRUCT); var sym = parse_symbol_name (); var type_param_list = parse_type_parameter_list (); @@ -3538,7 +3538,7 @@ public class Vala.Parser : CodeVisitor { void parse_interface_declaration (Symbol parent, List? attrs) throws ParseError { var begin = get_location (); var access = parse_access_modifier (); - var flags = parse_type_declaration_modifiers (); + var flags = parse_type_declaration_modifiers ("interfaces", ModifierFlags.EXTERN); expect (TokenType.INTERFACE); var sym = parse_symbol_name (); var type_param_list = parse_type_parameter_list (); @@ -3581,7 +3581,7 @@ public class Vala.Parser : CodeVisitor { void parse_enum_declaration (Symbol parent, List? attrs) throws ParseError { var begin = get_location (); var access = parse_access_modifier (); - var flags = parse_type_declaration_modifiers (); + var flags = parse_type_declaration_modifiers ("enums", ModifierFlags.EXTERN); expect (TokenType.ENUM); var sym = parse_symbol_name (); var en = new Enum (sym.name, get_src (begin), comment); @@ -3648,7 +3648,7 @@ public class Vala.Parser : CodeVisitor { void parse_errordomain_declaration (Symbol parent, List? attrs) throws ParseError { var begin = get_location (); var access = parse_access_modifier (); - var flags = parse_type_declaration_modifiers (); + var flags = parse_type_declaration_modifiers ("errordomains", ModifierFlags.EXTERN); expect (TokenType.ERRORDOMAIN); var sym = parse_symbol_name (); var ed = new ErrorDomain (sym.name, get_src (begin), comment); @@ -3729,9 +3729,10 @@ public class Vala.Parser : CodeVisitor { } } - ModifierFlags parse_type_declaration_modifiers () { + ModifierFlags parse_type_declaration_modifiers (string symbol_type, ModifierFlags supported) { ModifierFlags flags = 0; while (true) { + var begin = get_location (); switch (current ()) { case TokenType.ABSTRACT: next (); @@ -3752,6 +3753,12 @@ public class Vala.Parser : CodeVisitor { default: return flags; } + if (supported > 0) { + ModifierFlags unsupported = (flags | supported) ^ supported; + if (unsupported > 0) { + Report.error (get_src (begin), "`%s' modifier not applicable on %s", unsupported.to_string (), symbol_type); + } + } } }