Dirk Mueller - PING: [PATCH] C/C++: Implement -Wempty-body for do/while, clarify diagno (original) (raw)
This is the mail archive of the gcc-patches@gcc.gnu.orgmailing list for the GCC project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
- From: Dirk Mueller
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 13 Feb 2007 00:12:11 +0100
- Subject: PING: [PATCH] C/C++: Implement -Wempty-body for do/while, clarify diagnostic
- References: <200702011405.48601.dmueller@suse.de> <200702102343.09758.dmuell@gmx.net>
On Saturday, 10. February 2007 23:43, Dirk Mueller wrote:
bootstrapped and regtested against yesterdays trunk.
Actually I just notice I posted the wrong patch. the correct one is below.
Any comments? Can at least the diagnostic clarification go in?
Thanks, Dirk 2007-02-11 Dirk Mueller dmueller@suse.de
* c-common.h (empty_body_warning): Rename to empty_if_body_warning.
* c-common.c (empty_if_body_warning): Rephrase diagnostic message.
* c-parser.c (c_parser_if_body): Always add an empty statement in case
of empty body.
* c-parser.c (c_parser_do_statement): Warn about empty body in
do/while statement.
* c-typeck (c_finish_if_stmt): Call empty_if_body_warning.
* doc/invoke.texi (-Wempty-body): Update documentation.
* cp/semantics.c (c_finish_if_stmt): Call empty_if_body_warning.
(finish_do_body): Warn about empty body in do/while statement.
* g++.dg/warn/do-empty.C: New.
* gcc.dg/do-empty.c: New.
* gcc.dg/if-empty-1.c: Update.
* gcc.dg/20001116-1.c: Update.
* gcc.dg/pr23165.c: Update.
--- cp/semantics.c (revision 121595) +++ cp/semantics.c (working copy) @@ -697,7 +697,7 @@ finish_if_stmt (tree if_stmt) TREE_CHAIN (if_stmt) = NULL; add_stmt (do_poplevel (scope)); finish_stmt (); - empty_body_warning (THEN_CLAUSE (if_stmt), ELSE_CLAUSE (if_stmt)); + empty_if_body_warning (THEN_CLAUSE (if_stmt), ELSE_CLAUSE (if_stmt)); } /* Begin a while-statement. Returns a newly created WHILE_STMT if @@ -750,7 +750,14 @@ begin_do_stmt (void) void finish_do_body (tree do_stmt) { - DO_BODY (do_stmt) = pop_stmt_list (DO_BODY (do_stmt)); + tree body = DO_BODY (do_stmt) = pop_stmt_list (DO_BODY (do_stmt)); + + if (TREE_CODE (body) == STATEMENT_LIST && STATEMENT_LIST_TAIL (body)) + body = STATEMENT_LIST_TAIL (body)->stmt; + + if (IS_EMPTY_STMT (body)) + warning (OPT_Wempty_body, + "suggest explicit braces around empty body in %<do%> statement"); } /* Finish a do-statement, which may be given by DO_STMT, and whose --- c-common.h (revision 121595) +++ c-common.h (working copy) @@ -670,7 +670,7 @@ extern tree fix_string_type (tree); struct varray_head_tag; extern void constant_expression_warning (tree); extern void strict_aliasing_warning (tree, tree, tree); -extern void empty_body_warning (tree, tree); +extern void empty_if_body_warning (tree, tree); extern tree convert_and_check (tree, tree); extern void overflow_warning (tree); extern void check_main_parameter_types (tree decl); --- c-common.c (revision 121595) +++ c-common.c (working copy) @@ -1008,26 +1009,23 @@ strict_aliasing_warning (tree otype, tre block. */ void -empty_body_warning (tree inner_then, tree inner_else) +empty_if_body_warning (tree inner_then, tree inner_else) { - if (warn_empty_body) - { - if (TREE_CODE (inner_then) == STATEMENT_LIST - && STATEMENT_LIST_TAIL (inner_then)) - inner_then = STATEMENT_LIST_TAIL (inner_then)->stmt;
if (inner_else && TREE_CODE (inner_else) == STATEMENT_LIST
&& STATEMENT_LIST_TAIL (inner_else))
- inner_else = STATEMENT_LIST_TAIL (inner_else)->stmt;
if (IS_EMPTY_STMT (inner_then) && !inner_else)
- warning (OPT_Wempty_body, "%Hempty body in an if-statement",
EXPR_LOCUS (inner_then));
if (inner_else && IS_EMPTY_STMT (inner_else))
- warning (OPT_Wempty_body, "%Hempty body in an else-statement",
EXPR_LOCUS (inner_else));
- }
- if (TREE_CODE (inner_then) == STATEMENT_LIST
&& STATEMENT_LIST_TAIL (inner_then))
- inner_then = STATEMENT_LIST_TAIL (inner_then)->stmt;
- if (inner_else && TREE_CODE (inner_else) == STATEMENT_LIST
&& STATEMENT_LIST_TAIL (inner_else))
- inner_else = STATEMENT_LIST_TAIL (inner_else)->stmt;
- if (IS_EMPTY_STMT (inner_then) && !inner_else)
- warning (OPT_Wempty_body, "%Hsuggest braces around empty body "
"in an %<if%> statement", EXPR_LOCUS (inner_then));
- if (inner_else && IS_EMPTY_STMT (inner_else))
- warning (OPT_Wempty_body, "%Hsuggest braces around empty body "
"in an %<else%> statement", EXPR_LOCUS (inner_else));
} /* Warn for unlikely, improbable, or stupid DECL declarations --- c-parser.c (revision 121595) +++ c-parser.c (working copy) @@ -3844,7 +3844,7 @@ c_parser_if_body (c_parser *parser, bool && c_parser_peek_2nd_token (parser)->type == CPP_COLON)) c_parser_label (parser); *if_p = c_parser_next_token_is_keyword (parser, RID_IF); - if (warn_empty_body && c_parser_next_token_is (parser, CPP_SEMICOLON)) + if (c_parser_next_token_is (parser, CPP_SEMICOLON)) add_stmt (build_empty_stmt ()); c_parser_statement_after_labels (parser); return c_end_compound_stmt (block, flag_isoc99); @@ -3953,6 +3953,9 @@ c_parser_do_statement (c_parser parser) location_t loc; gcc_assert (c_parser_next_token_is_keyword (parser, RID_DO)); c_parser_consume_token (parser); + if (c_parser_next_token_is (parser, CPP_SEMICOLON)) + warning (OPT_Wempty_body, + "suggest braces around empty body in %<do%> statement"); block = c_begin_compound_stmt (flag_isoc99); loc = c_parser_peek_token (parser)->location; save_break = c_break_label; --- c-typeck.c (revision 121595) +++ c-typeck.c (working copy) @@ -7216,7 +7245,7 @@ c_finish_if_stmt (location_t if_locus, t &if_locus); } - empty_body_warning (then_block, else_block); + empty_if_body_warning (then_block, else_block); stmt = build3 (COND_EXPR, void_type_node, cond, then_block, else_block); SET_EXPR_LOCATION (stmt, if_locus); --- doc/invoke.texi (revision 121595) +++ doc/invoke.texi (working copy) @@ -2950,8 +2950,9 @@ functions. This warning can be independ @option{-Wmissing-parameter-type}. @item -An empty body occurs in an @samp{if} or @samp{else} statement. This -warning can be independently controlled by @option{-Wempty-body}. +An empty body occurs in an @samp{if}, @samp{else} or +@samp{do while} statement. This warning can be independently +controlled by @option{-Wempty-body}. @item A pointer is compared against integer zero with @samp{<}, @samp{<=}, --- testsuite/gcc.dg/do-empty.c (revision 0) +++ testsuite/gcc.dg/do-empty.c (revision 0) @@ -0,0 +1,15 @@ +/ Test diagnostics for empty bodies in do / while. / +/ { dg-do compile } / +/ { dg-options "-Wempty-body" } / + +void +f (int x) +{ + do + ; / { dg-warning "empty body in" } / + while (x--); + + do + {} / { dg-bogus "empty body in" } */ + while (++x < 10); +} Index: testsuite/gcc.dg/if-empty-1.c
--- testsuite/gcc.dg/if-empty-1.c (revision 121595) +++ testsuite/gcc.dg/if-empty-1.c (working copy) @@ -7,7 +7,7 @@ void f (int x) { if (x) - ; /* { dg-warning "warning: empty body in an if-statement" } / + ; / { dg-warning "empty body in an" } / if (x) ; / By design we don't warn in this case. / else @@ -15,7 +15,7 @@ f (int x) if (x) (void)0; else - ; / { dg-warning "warning: empty body in an else-statement" } / + ; / { dg-warning "empty body in an" } */ if (x) (void)0; else Index: testsuite/g++.dg/warn/do-empty.C
--- testsuite/g++.dg/warn/do-empty.C (revision 0) +++ testsuite/g++.dg/warn/do-empty.C (revision 0) @@ -0,0 +1,15 @@ +/* Test diagnostics for empty bodies in do / while. / +/ { dg-do compile } / +/ { dg-options "-Wempty-body" } / + +void +f (int x) +{ + do + ; / { dg-warning "empty body in" } / + while (x--); + + do + {} / { dg-bogus "empty body in" } */ + while (++x < 10); +} Index: testsuite/gcc.dg/20001116-1.c
--- testsuite/gcc.dg/20001116-1.c (revision 121595) +++ testsuite/gcc.dg/20001116-1.c (working copy) @@ -7,5 +7,5 @@ void foo (int x) { if (x) - ; /* { dg-warning "empty body in an if-statement" } / + ; / { dg-warning "empty body in an" } */ } Index: testsuite/gcc.dg/pr23165.c
--- testsuite/gcc.dg/pr23165.c (revision 121595) +++ testsuite/gcc.dg/pr23165.c (working copy) @@ -3,7 +3,7 @@ void foo (void) { if (0) - a: ; /* { dg-warning "empty body in an if-statement" } / + a: ; / { dg-warning "empty body in an" } */
}
- Follow-Ups:
- Re: PING: [PATCH] C/C++: Implement -Wempty-body for do/while, clarify diagnostic
* From: Gabriel Dos Reis
- Re: PING: [PATCH] C/C++: Implement -Wempty-body for do/while, clarify diagnostic
- References:
- [PATCH] C/C++: Implement -Wempty-body for do/while, clarify diagnostic
* From: Dirk Mueller - PING: [PATCH] C/C++: Implement -Wempty-body for do/while, clarify diagnostic
* From: Dirk Mueller
- [PATCH] C/C++: Implement -Wempty-body for do/while, clarify diagnostic
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |