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