Commit d49718d6 by Marek Polacek Committed by Marek Polacek

re PR c/81364 (Bogus -Wmultistatement-macros warning)

	PR c/81364
	* c-parser.c (c_parser_else_body): Don't warn about multistatement
	macro expansion if the body is in { }.
	(c_parser_while_statement): Likewise.
	(c_parser_for_statement): Likewise.

	* Wmultistatement-macros-12.c: New test.

From-SVN: r250498
parent 0e82a9b9
2017-07-25 Marek Polacek <polacek@redhat.com>
PR c/81364
* c-parser.c (c_parser_else_body): Don't warn about multistatement
macro expansion if the body is in { }.
(c_parser_while_statement): Likewise.
(c_parser_for_statement): Likewise.
2017-07-18 Nathan Sidwell <nathan@acm.org> 2017-07-18 Nathan Sidwell <nathan@acm.org>
* c-parser.c (c_parser_array_notation): Use TYPE_{MIN,MAX}_VALUE. * c-parser.c (c_parser_array_notation): Use TYPE_{MIN,MAX}_VALUE.
......
...@@ -5557,7 +5557,8 @@ c_parser_else_body (c_parser *parser, const token_indent_info &else_tinfo, ...@@ -5557,7 +5557,8 @@ c_parser_else_body (c_parser *parser, const token_indent_info &else_tinfo,
} }
else else
{ {
body_loc_after_labels = c_parser_peek_token (parser)->location; if (!c_parser_next_token_is (parser, CPP_OPEN_BRACE))
body_loc_after_labels = c_parser_peek_token (parser)->location;
c_parser_statement_after_labels (parser, NULL, chain); c_parser_statement_after_labels (parser, NULL, chain);
} }
...@@ -5811,6 +5812,7 @@ c_parser_while_statement (c_parser *parser, bool ivdep, bool *if_p) ...@@ -5811,6 +5812,7 @@ c_parser_while_statement (c_parser *parser, bool ivdep, bool *if_p)
= get_token_indent_info (c_parser_peek_token (parser)); = get_token_indent_info (c_parser_peek_token (parser));
location_t loc_after_labels; location_t loc_after_labels;
bool open_brace = c_parser_next_token_is (parser, CPP_OPEN_BRACE);
body = c_parser_c99_block_statement (parser, if_p, &loc_after_labels); body = c_parser_c99_block_statement (parser, if_p, &loc_after_labels);
c_finish_loop (loc, cond, NULL, body, c_break_label, c_cont_label, true); c_finish_loop (loc, cond, NULL, body, c_break_label, c_cont_label, true);
add_stmt (c_end_compound_stmt (loc, block, flag_isoc99)); add_stmt (c_end_compound_stmt (loc, block, flag_isoc99));
...@@ -5820,7 +5822,7 @@ c_parser_while_statement (c_parser *parser, bool ivdep, bool *if_p) ...@@ -5820,7 +5822,7 @@ c_parser_while_statement (c_parser *parser, bool ivdep, bool *if_p)
= get_token_indent_info (c_parser_peek_token (parser)); = get_token_indent_info (c_parser_peek_token (parser));
warn_for_misleading_indentation (while_tinfo, body_tinfo, next_tinfo); warn_for_misleading_indentation (while_tinfo, body_tinfo, next_tinfo);
if (next_tinfo.type != CPP_SEMICOLON) if (next_tinfo.type != CPP_SEMICOLON && !open_brace)
warn_for_multistatement_macros (loc_after_labels, next_tinfo.location, warn_for_multistatement_macros (loc_after_labels, next_tinfo.location,
while_tinfo.location, RID_WHILE); while_tinfo.location, RID_WHILE);
...@@ -6109,6 +6111,7 @@ c_parser_for_statement (c_parser *parser, bool ivdep, bool *if_p) ...@@ -6109,6 +6111,7 @@ c_parser_for_statement (c_parser *parser, bool ivdep, bool *if_p)
= get_token_indent_info (c_parser_peek_token (parser)); = get_token_indent_info (c_parser_peek_token (parser));
location_t loc_after_labels; location_t loc_after_labels;
bool open_brace = c_parser_next_token_is (parser, CPP_OPEN_BRACE);
body = c_parser_c99_block_statement (parser, if_p, &loc_after_labels); body = c_parser_c99_block_statement (parser, if_p, &loc_after_labels);
if (is_foreach_statement) if (is_foreach_statement)
...@@ -6122,7 +6125,7 @@ c_parser_for_statement (c_parser *parser, bool ivdep, bool *if_p) ...@@ -6122,7 +6125,7 @@ c_parser_for_statement (c_parser *parser, bool ivdep, bool *if_p)
= get_token_indent_info (c_parser_peek_token (parser)); = get_token_indent_info (c_parser_peek_token (parser));
warn_for_misleading_indentation (for_tinfo, body_tinfo, next_tinfo); warn_for_misleading_indentation (for_tinfo, body_tinfo, next_tinfo);
if (next_tinfo.type != CPP_SEMICOLON) if (next_tinfo.type != CPP_SEMICOLON && !open_brace)
warn_for_multistatement_macros (loc_after_labels, next_tinfo.location, warn_for_multistatement_macros (loc_after_labels, next_tinfo.location,
for_tinfo.location, RID_FOR); for_tinfo.location, RID_FOR);
......
2017-07-25 Marek Polacek <polacek@redhat.com>
PR c/81364
* Wmultistatement-macros-12.c: New test.
2017-07-25 Kyrylo Tkachov <kyrylo.tkachov@arm.com> 2017-07-25 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR target/81414 PR target/81414
......
/* PR c/81364 */
/* { dg-do compile } */
/* { dg-options "-Wmultistatement-macros" } */
#define FOO0 if (1) { } else
#define TST0 \
void bar0 (void) \
{ \
FOO0 { } /* { dg-bogus "macro expands to multiple statements" } */ \
}
TST0
#define FOO1 for (;;)
#define TST1 \
void bar1 (void) \
{ \
FOO1 { } /* { dg-bogus "macro expands to multiple statements" } */ \
}
TST1
#define FOO2 while (1)
#define TST2 \
void bar2 (void) \
{ \
FOO2 { } /* { dg-bogus "macro expands to multiple statements" } */ \
}
TST2
#define FOO3 switch (1)
#define TST3 \
void bar3 (void) \
{ \
FOO3 { } /* { dg-bogus "macro expands to multiple statements" } */ \
}
TST3
#define FOO4 if (1)
#define TST4 \
void bar4 (void) \
{ \
FOO4 { } /* { dg-bogus "macro expands to multiple statements" } */ \
}
TST4
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment