xref: /netbsd-src/tests/usr.bin/xlint/lint1/msg_249.c (revision 6937eff333b197fb14840f0e58df0f7a0edfd51a)
1 /*	$NetBSD: msg_249.c,v 1.16 2024/11/13 04:32:49 rillig Exp $	*/
2 # 3 "msg_249.c"
3 
4 // Test for message: syntax error '%s' [249]
5 
6 /* lint1-extra-flags: -X 351 */
7 
8 /*
9  * Cover the grammar rule 'top_level_declaration: error T_SEMI'.
10  */
11 /* expect+1: error: syntax error '"' [249] */
12 "syntax error in top_level_declaration";
13 
14 /* XXX: This is necessary to recover the yacc parser. */
15 int recover_from_semi;
16 
17 /*
18  * Cover the grammar rule 'top_level_declaration: error T_RBRACE'.
19  */
20 /* expect+1: error: syntax error '"' [249] */
21 "syntax error in top_level_declaration"}
22 
23 /* XXX: This is necessary to recover the yacc parser. */
24 int recover_from_rbrace;
25 
26 /*
27  * Before func.c 1.110 from 2021-06-19, lint ran into this:
28  * assertion "cstmt->c_kind == kind" failed in end_control_statement
29  */
30 void
31 function(void)
32 {
33 	if (0)
34 		/* expect+1: warning: 'empty' statement not reached [193] */
35 		;
36 	/* expect+1: error: syntax error ')' [249] */
37 	);
38 }
39 
40 /* XXX: It is unexpected that this error is not detected. */
41 "This syntax error is not detected.";
42 
43 /* XXX: This is necessary to recover the yacc parser. */
44 double recover_from_rparen;
45 
46 /* Ensure that the declaration after the syntax error is processed. */
47 double *
48 access_declaration_after_syntax_error(void)
49 {
50 	return &recover_from_rparen;
51 }
52 
53 struct cover_member_declaration {
54 	/* cover 'noclass_declmods ... notype_member_decls' */
55 	const noclass_declmods;
56 
57 	/* cover 'noclass_declspecs ...' */
58 	const int noclass_declspecs;
59 
60 	/* cover 'add_type_qualifier_list end_type' */
61 	/* expect+1: error: syntax error 'member without type' [249] */
62 	const;
63 };
64 
65 /*
66  * At this point, lint assumes that the following code is still in the
67  * function 'access_declaration_after_syntax_error'.
68  */
69 
70 int gcc_statement_expression_1 = ({
71 unused_label:
72 	1;
73 	1;
74 	/* expect+2: error: syntax error 'labels are only valid inside a function' [249] */
75 	/* expect+1: error: non-constant initializer [177] */
76 });
77 
78 /* Even another function definition does not help. */
79 void
80 try_to_recover(void)
81 {
82 }
83 
84 int gcc_statement_expression_2 = ({
85 unused_label:
86 	1;
87 	1;
88 	/* expect+2: error: syntax error 'labels are only valid inside a function' [249] */
89 	/* expect+1: error: non-constant initializer [177] */
90 });
91