From 197638d4d29f0e9790fc7cb95648c25f7305bafa Mon Sep 17 00:00:00 2001 From: ian Date: Tue, 5 Apr 2005 01:15:08 +0000 Subject: [PATCH] * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@97593 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 14 +++++++++++++ gcc/c-common.c | 64 ++++++++++++++++++++++++++++++++++++++++------------------ gcc/c-common.h | 1 + gcc/c-typeck.c | 18 ++++++++--------- 4 files changed, 68 insertions(+), 29 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 36608c76256..b3e4dcd156a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +2005-04-04 Ian Lance Taylor + + * 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 Daniel Jacobowitz diff --git a/gcc/c-common.c b/gcc/c-common.c index 5705f4d1eb2..817d939be3b 100644 --- a/gcc/c-common.c +++ b/gcc/c-common.c @@ -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. */ diff --git a/gcc/c-common.h b/gcc/c-common.h index 7794adedbeb..f313e6883ca 100644 --- a/gcc/c-common.h +++ b/gcc/c-common.h @@ -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); diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index d6ffc87cf39..663dd7f351e 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -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; -- 2.11.0