On 6/19/19 8:18 PM, Marek Polacek wrote:
We are wrongly accepting invalid code like:struct alignas(16 S2 { }; // missing ) The reason is that cp_parser_type_specifier uses tentative parsing to see if we're dealing with a class-specifier, and if that doesn't work, it looks for an elaborated-type-specifier. When trying to parse it as a class-specifier, we use cp_parser_class_head which parses any attributes after the class-key via cp_parser_attributes_opt, and that includes an alignment-specifier. So we're parsing the alignment-specifier, find the missing ')', but since we are parsing tentatively, no error is issued. Then we get back to cp_parser_class_head, and that commits: 23862 /* At this point, we're going ahead with the class-specifier, even 23863 if some other problem occurs. */ 23864 cp_parser_commit_to_tentative_parse (parser); so we lose the error. Fixed as below. Other approach would be to use a tentative_firewall, but that would be a much bigger hammer.
...and here you only commit when you know there's going to be an error, so if follow-on errors make less sense it isn't a big deal. OK.
Jason
