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