1*6937eff3Srillig /* $NetBSD: msg_249.c,v 1.16 2024/11/13 04:32:49 rillig Exp $ */ 2a0a15c14Srillig # 3 "msg_249.c" 3a0a15c14Srillig 4a0a15c14Srillig // Test for message: syntax error '%s' [249] 5a0a15c14Srillig 6b2baa501Srillig /* lint1-extra-flags: -X 351 */ 7b2baa501Srillig 8e4ad66c5Srillig /* 9fdd37104Srillig * Cover the grammar rule 'top_level_declaration: error T_SEMI'. 10fdd37104Srillig */ 11c83f7defSrillig /* expect+1: error: syntax error '"' [249] */ 12fdd37104Srillig "syntax error in top_level_declaration"; 13fdd37104Srillig 14fdd37104Srillig /* XXX: This is necessary to recover the yacc parser. */ 15fdd37104Srillig int recover_from_semi; 16fdd37104Srillig 17fdd37104Srillig /* 18fdd37104Srillig * Cover the grammar rule 'top_level_declaration: error T_RBRACE'. 19fdd37104Srillig */ 20c83f7defSrillig /* expect+1: error: syntax error '"' [249] */ 21fdd37104Srillig "syntax error in top_level_declaration"} 22fdd37104Srillig 23fdd37104Srillig /* XXX: This is necessary to recover the yacc parser. */ 24fdd37104Srillig int recover_from_rbrace; 25fdd37104Srillig 26fdd37104Srillig /* 27e4ad66c5Srillig * Before func.c 1.110 from 2021-06-19, lint ran into this: 28e4ad66c5Srillig * assertion "cstmt->c_kind == kind" failed in end_control_statement 29e4ad66c5Srillig */ 30e4ad66c5Srillig void 31e4ad66c5Srillig function(void) 32e4ad66c5Srillig { 33e4ad66c5Srillig if (0) 34*6937eff3Srillig /* expect+1: warning: 'empty' statement not reached [193] */ 35e4ad66c5Srillig ; 3636dcebf9Srillig /* expect+1: error: syntax error ')' [249] */ 3736dcebf9Srillig ); 38e4ad66c5Srillig } 39fdd37104Srillig 406dc7601cSrillig /* XXX: It is unexpected that this error is not detected. */ 416dc7601cSrillig "This syntax error is not detected."; 426dc7601cSrillig 43fdd37104Srillig /* XXX: This is necessary to recover the yacc parser. */ 446dc7601cSrillig double recover_from_rparen; 456dc7601cSrillig 466dc7601cSrillig /* Ensure that the declaration after the syntax error is processed. */ 476dc7601cSrillig double * 486dc7601cSrillig access_declaration_after_syntax_error(void) 496dc7601cSrillig { 506dc7601cSrillig return &recover_from_rparen; 516dc7601cSrillig } 52cbc36439Srillig 53cbc36439Srillig struct cover_member_declaration { 54cbc36439Srillig /* cover 'noclass_declmods ... notype_member_decls' */ 55cbc36439Srillig const noclass_declmods; 56cbc36439Srillig 57cbc36439Srillig /* cover 'noclass_declspecs ...' */ 58cbc36439Srillig const int noclass_declspecs; 59cbc36439Srillig 607154d315Srillig /* cover 'add_type_qualifier_list end_type' */ 6145bf3e9eSrillig /* expect+1: error: syntax error 'member without type' [249] */ 62cbc36439Srillig const; 63cbc36439Srillig }; 643851fec0Srillig 653851fec0Srillig /* 663851fec0Srillig * At this point, lint assumes that the following code is still in the 673851fec0Srillig * function 'access_declaration_after_syntax_error'. 683851fec0Srillig */ 693851fec0Srillig 703851fec0Srillig int gcc_statement_expression_1 = ({ 713851fec0Srillig unused_label: 723851fec0Srillig 1; 733851fec0Srillig 1; 74d2c16d57Srillig /* expect+2: error: syntax error 'labels are only valid inside a function' [249] */ 75d2c16d57Srillig /* expect+1: error: non-constant initializer [177] */ 763851fec0Srillig }); 773851fec0Srillig 783851fec0Srillig /* Even another function definition does not help. */ 793851fec0Srillig void 803851fec0Srillig try_to_recover(void) 813851fec0Srillig { 823851fec0Srillig } 833851fec0Srillig 843851fec0Srillig int gcc_statement_expression_2 = ({ 853851fec0Srillig unused_label: 863851fec0Srillig 1; 873851fec0Srillig 1; 88d2c16d57Srillig /* expect+2: error: syntax error 'labels are only valid inside a function' [249] */ 89d2c16d57Srillig /* expect+1: error: non-constant initializer [177] */ 903851fec0Srillig }); 91