c-typeck.c (struct c_switch): Rename switch_stmt field to switch_expr.
* c-typeck.c (struct c_switch): Rename switch_stmt field to switch_expr. (c_start_case): Build SWITCH_EXPR, not SWITCH_STMT. (do_case): Use SWITCH_COND rather than SWITCH_STMT_COND. (c_finish_case): Use SWITCH_BODY rather than SWITCH_STMT_BODY. Call c_do_switch_expr_warnings rather than c_do_switch_warnings. * c-common.c (c_do_switch_warnings_1): New static function broken out of c_do_switch_warnings. (c_do_switch_warnings): Call c_do_switch_warnings_1. (c_do_switch_expr_warnings): New function. * c-common.h (c_do_switch_expr_warnings): Declare. From-SVN: r97593
This commit is contained in:
parent
bfcf81bf39
commit
604f5adf98
@ -1,3 +1,17 @@
|
||||
2005-04-04 Ian Lance Taylor <ian@airs.com>
|
||||
|
||||
* c-typeck.c (struct c_switch): Rename switch_stmt field to
|
||||
switch_expr.
|
||||
(c_start_case): Build SWITCH_EXPR, not SWITCH_STMT.
|
||||
(do_case): Use SWITCH_COND rather than SWITCH_STMT_COND.
|
||||
(c_finish_case): Use SWITCH_BODY rather than SWITCH_STMT_BODY.
|
||||
Call c_do_switch_expr_warnings rather than c_do_switch_warnings.
|
||||
* c-common.c (c_do_switch_warnings_1): New static function broken
|
||||
out of c_do_switch_warnings.
|
||||
(c_do_switch_warnings): Call c_do_switch_warnings_1.
|
||||
(c_do_switch_expr_warnings): New function.
|
||||
* c-common.h (c_do_switch_expr_warnings): Declare.
|
||||
|
||||
2005-04-04 David Edelsohn <edelsohn@gnu.org>
|
||||
Daniel Jacobowitz <dan@codesourcery.com>
|
||||
|
||||
|
@ -3708,32 +3708,17 @@ match_case_to_enum (splay_tree_node node, void *data)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Handle -Wswitch*. Called from the front end after parsing the switch
|
||||
construct. */
|
||||
/* ??? Should probably be somewhere generic, since other languages besides
|
||||
C and C++ would want this. We'd want to agree on the data structure,
|
||||
however, which is a problem. Alternately, we operate on gimplified
|
||||
switch_exprs, which I don't especially like. At the moment, however,
|
||||
C/C++ are the only tree-ssa languages that support enumerations at all,
|
||||
so the point is moot. */
|
||||
/* Common code for -Wswitch*. */
|
||||
|
||||
void
|
||||
c_do_switch_warnings (splay_tree cases, tree switch_stmt)
|
||||
static void
|
||||
c_do_switch_warnings_1 (splay_tree cases, location_t switch_location,
|
||||
tree type, tree cond)
|
||||
{
|
||||
splay_tree_node default_node;
|
||||
location_t switch_location;
|
||||
tree type;
|
||||
|
||||
if (!warn_switch && !warn_switch_enum && !warn_switch_default)
|
||||
return;
|
||||
|
||||
if (EXPR_HAS_LOCATION (switch_stmt))
|
||||
switch_location = EXPR_LOCATION (switch_stmt);
|
||||
else
|
||||
switch_location = input_location;
|
||||
|
||||
type = SWITCH_STMT_TYPE (switch_stmt);
|
||||
|
||||
default_node = splay_tree_lookup (cases, (splay_tree_key) NULL);
|
||||
if (warn_switch_default && !default_node)
|
||||
warning ("%Hswitch missing default case", &switch_location);
|
||||
@ -3744,7 +3729,7 @@ c_do_switch_warnings (splay_tree cases, tree switch_stmt)
|
||||
default case, or when -Wswitch-enum was specified. */
|
||||
if (((warn_switch && !default_node) || warn_switch_enum)
|
||||
&& type && TREE_CODE (type) == ENUMERAL_TYPE
|
||||
&& TREE_CODE (SWITCH_STMT_COND (switch_stmt)) != INTEGER_CST)
|
||||
&& TREE_CODE (cond) != INTEGER_CST)
|
||||
{
|
||||
tree chain;
|
||||
|
||||
@ -3788,6 +3773,45 @@ c_do_switch_warnings (splay_tree cases, tree switch_stmt)
|
||||
}
|
||||
}
|
||||
|
||||
/* Handle -Wswitch* for a SWITCH_STMT. Called from the front end
|
||||
after parsing the switch construct. */
|
||||
/* ??? Should probably be somewhere generic, since other languages besides
|
||||
C and C++ would want this. We'd want to agree on the data structure,
|
||||
however, which is a problem. Alternately, we operate on gimplified
|
||||
switch_exprs, which I don't especially like. At the moment, however,
|
||||
C/C++ are the only tree-ssa languages that support enumerations at all,
|
||||
so the point is moot. */
|
||||
|
||||
void
|
||||
c_do_switch_warnings (splay_tree cases, tree switch_stmt)
|
||||
{
|
||||
location_t switch_location;
|
||||
|
||||
if (EXPR_HAS_LOCATION (switch_stmt))
|
||||
switch_location = EXPR_LOCATION (switch_stmt);
|
||||
else
|
||||
switch_location = input_location;
|
||||
c_do_switch_warnings_1 (cases, switch_location,
|
||||
SWITCH_STMT_TYPE (switch_stmt),
|
||||
SWITCH_STMT_COND (switch_stmt));
|
||||
}
|
||||
|
||||
/* Like c_do_switch_warnings, but takes a SWITCH_EXPR rather than a
|
||||
SWITCH_STMT. */
|
||||
|
||||
void
|
||||
c_do_switch_expr_warnings (splay_tree cases, tree switch_expr)
|
||||
{
|
||||
location_t switch_location;
|
||||
|
||||
if (EXPR_HAS_LOCATION (switch_expr))
|
||||
switch_location = EXPR_LOCATION (switch_expr);
|
||||
else
|
||||
switch_location = input_location;
|
||||
c_do_switch_warnings_1 (cases, switch_location, TREE_TYPE (switch_expr),
|
||||
SWITCH_COND (switch_expr));
|
||||
}
|
||||
|
||||
/* Finish an expression taking the address of LABEL (an
|
||||
IDENTIFIER_NODE). Returns an expression for the address. */
|
||||
|
||||
|
@ -825,6 +825,7 @@ extern int case_compare (splay_tree_key, splay_tree_key);
|
||||
extern tree c_add_case_label (splay_tree, tree, tree, tree, tree);
|
||||
|
||||
extern void c_do_switch_warnings (splay_tree, tree);
|
||||
extern void c_do_switch_expr_warnings (splay_tree, tree);
|
||||
|
||||
extern tree build_function_call (tree, tree);
|
||||
|
||||
|
@ -6609,8 +6609,8 @@ c_finish_return (tree retval)
|
||||
}
|
||||
|
||||
struct c_switch {
|
||||
/* The SWITCH_STMT being built. */
|
||||
tree switch_stmt;
|
||||
/* The SWITCH_EXPR being built. */
|
||||
tree switch_expr;
|
||||
|
||||
/* The original type of the testing expression, i.e. before the
|
||||
default conversion is applied. */
|
||||
@ -6641,7 +6641,7 @@ struct c_switch {
|
||||
struct c_switch *c_switch_stack;
|
||||
|
||||
/* Start a C switch statement, testing expression EXP. Return the new
|
||||
SWITCH_STMT. */
|
||||
SWITCH_EXPR. */
|
||||
|
||||
tree
|
||||
c_start_case (tree exp)
|
||||
@ -6677,16 +6677,16 @@ c_start_case (tree exp)
|
||||
}
|
||||
}
|
||||
|
||||
/* Add this new SWITCH_STMT to the stack. */
|
||||
/* Add this new SWITCH_EXPR to the stack. */
|
||||
cs = XNEW (struct c_switch);
|
||||
cs->switch_stmt = build_stmt (SWITCH_STMT, exp, NULL_TREE, orig_type);
|
||||
cs->switch_expr = build3 (SWITCH_EXPR, orig_type, exp, NULL_TREE, NULL_TREE);
|
||||
cs->orig_type = orig_type;
|
||||
cs->cases = splay_tree_new (case_compare, NULL, NULL);
|
||||
cs->blocked_stmt_expr = 0;
|
||||
cs->next = c_switch_stack;
|
||||
c_switch_stack = cs;
|
||||
|
||||
return add_stmt (cs->switch_stmt);
|
||||
return add_stmt (cs->switch_expr);
|
||||
}
|
||||
|
||||
/* Process a case label. */
|
||||
@ -6699,7 +6699,7 @@ do_case (tree low_value, tree high_value)
|
||||
if (c_switch_stack && !c_switch_stack->blocked_stmt_expr)
|
||||
{
|
||||
label = c_add_case_label (c_switch_stack->cases,
|
||||
SWITCH_STMT_COND (c_switch_stack->switch_stmt),
|
||||
SWITCH_COND (c_switch_stack->switch_expr),
|
||||
c_switch_stack->orig_type,
|
||||
low_value, high_value);
|
||||
if (label == error_mark_node)
|
||||
@ -6729,12 +6729,12 @@ c_finish_case (tree body)
|
||||
{
|
||||
struct c_switch *cs = c_switch_stack;
|
||||
|
||||
SWITCH_STMT_BODY (cs->switch_stmt) = body;
|
||||
SWITCH_BODY (cs->switch_expr) = body;
|
||||
|
||||
gcc_assert (!cs->blocked_stmt_expr);
|
||||
|
||||
/* Emit warnings as needed. */
|
||||
c_do_switch_warnings (cs->cases, cs->switch_stmt);
|
||||
c_do_switch_expr_warnings (cs->cases, cs->switch_expr);
|
||||
|
||||
/* Pop the stack. */
|
||||
c_switch_stack = cs->next;
|
||||
|
Loading…
Reference in New Issue
Block a user