/*	$NetBSD: msg_385.c,v 1.2 2025/03/10 22:08:36 rillig Exp $	*/
# 3 "msg_385.c"

// Test for message: do-while macro '%.*s' ends with semicolon [385]

/*
 * A function-like macro that consists of a do-while statement is intended to
 * expand to a single statement, but without the trailing semicolon, as the
 * semicolon is already provided by the calling site. When the macro expansion
 * ends with a semicolon, there are two semicolons, which can lead to syntax
 * errors.
 */

/* lint1-extra-flags: -X 351 */

/* expect+1: warning: do-while macro 'wrong_stmt' ends with semicolon [385] */
#define		wrong_stmt()	do { } while (0);

#define		correct_stmt()	do { } while (0)

/* expect+5: warning: do-while macro 'wrong_stmt_with_comment' ends with semicolon [385] */
#define wrong_stmt_with_comment() do { } while (0); /*
a
b
c
*/

#define correct_stmt_with_comment() do { } while (0) /*
a
b
c
*/

/* The comment marker inside the string literal does not start a comment. */
#define stmt_with_string() do { print("/*"); } while (0)

void
call_wrong_stmt(int x)
{
	if (x > 0)
		do { } while (0);;
	/* expect+1: error: syntax error 'else' [249] */
	else
		do { } while (0);;
}

void
call_correct_stmt(int x)
{
	if (x < 0)
		do { } while (0);
	else
		do { } while (0);
}

// The macro expansion does start with "do", but not with the keyword "do",
// so don't warn in this case.
#define unrelated() do_something();