xref: /netbsd-src/tests/usr.bin/xlint/lint1/msg_385.c (revision a8016b51bcf5204ff836e46c2432dc27e5b12586)
1*a8016b51Srillig /*	$NetBSD: msg_385.c,v 1.1 2024/12/08 17:12:01 rillig Exp $	*/
2*a8016b51Srillig # 3 "msg_385.c"
3*a8016b51Srillig 
4*a8016b51Srillig // Test for message: do-while macro '%.*s' ends with semicolon [385]
5*a8016b51Srillig 
6*a8016b51Srillig /*
7*a8016b51Srillig  * A function-like macro that consists of a do-while statement is intended to
8*a8016b51Srillig  * expand to a single statement, but without the trailing semicolon, as the
9*a8016b51Srillig  * semicolon is already provided by the calling site. When the macro expansion
10*a8016b51Srillig  * ends with a semicolon, there are two semicolons, which can lead to syntax
11*a8016b51Srillig  * errors.
12*a8016b51Srillig  */
13*a8016b51Srillig 
14*a8016b51Srillig /* lint1-extra-flags: -X 351 */
15*a8016b51Srillig 
16*a8016b51Srillig /* expect+1: warning: do-while macro 'wrong_stmt' ends with semicolon [385] */
17*a8016b51Srillig #define		wrong_stmt()	do { } while (0);
18*a8016b51Srillig 
19*a8016b51Srillig #define		correct_stmt()	do { } while (0)
20*a8016b51Srillig 
21*a8016b51Srillig /* expect+5: warning: do-while macro 'wrong_stmt_with_comment' ends with semicolon [385] */
22*a8016b51Srillig #define wrong_stmt_with_comment() do { } while (0); /*
23*a8016b51Srillig a
24*a8016b51Srillig b
25*a8016b51Srillig c
26*a8016b51Srillig */
27*a8016b51Srillig 
28*a8016b51Srillig #define correct_stmt_with_comment() do { } while (0) /*
29*a8016b51Srillig a
30*a8016b51Srillig b
31*a8016b51Srillig c
32*a8016b51Srillig */
33*a8016b51Srillig 
34*a8016b51Srillig /* The comment marker inside the string literal does not start a comment. */
35*a8016b51Srillig #define stmt_with_string() do { print("/*"); } while (0)
36*a8016b51Srillig 
37*a8016b51Srillig void
38*a8016b51Srillig call_wrong_stmt(int x)
39*a8016b51Srillig {
40*a8016b51Srillig 	if (x > 0)
41*a8016b51Srillig 		do { } while (0);;
42*a8016b51Srillig 	/* expect+1: error: syntax error 'else' [249] */
43*a8016b51Srillig 	else
44*a8016b51Srillig 		do { } while (0);;
45*a8016b51Srillig }
46*a8016b51Srillig 
47*a8016b51Srillig void
48*a8016b51Srillig call_correct_stmt(int x)
49*a8016b51Srillig {
50*a8016b51Srillig 	if (x < 0)
51*a8016b51Srillig 		do { } while (0);
52*a8016b51Srillig 	else
53*a8016b51Srillig 		do { } while (0);
54*a8016b51Srillig }
55