diff options
author | Mark Mitchell <mark@codesourcery.com> | 2000-09-10 21:34:41 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2000-09-10 21:34:41 +0000 |
commit | 56cb97339bc91ec1b4df74a8bb4a31d4c363aee2 (patch) | |
tree | e6b472ea3504de9f1d42acce2241fe0cbaf55dcf /gcc/stmt.c | |
parent | 2c9f4db73acfb821ad776df950e908daac642530 (diff) | |
download | gcc-56cb97339bc91ec1b4df74a8bb4a31d4c363aee2.zip gcc-56cb97339bc91ec1b4df74a8bb4a31d4c363aee2.tar.gz gcc-56cb97339bc91ec1b4df74a8bb4a31d4c363aee2.tar.bz2 |
c-common.h (add_stmt): Change prototype.
* c-common.h (add_stmt): Change prototype.
(RECHAIN_STMTS): New macro.
(CASE_LABEL_DECL): Likewise.
(genrtl_case_label): Change prototype.
(c_expand_start_case): Remove prototype.
(build_case_label): Change prototype.
(decl_constant_value): Declare.
* c-common.c (check_case_value): Handle C++'s extensions to C
semantics.
* c-commnon.def (CASE_LABEL): Add room for the CASE_LABEL_DECL
field.
* c-parse.in (stmt): Adjust handling of return statements and case
laels.
* c-semantics.c (add_stmt): Return the new statement.
(genrtl_return_stmt): Take the RETURN_STMT as input, not the
returned expression. Directly generate RTL, rather than calling
c_expand_return.
(genrtl_switch_stmt): Don't call c_expand_start_case.
(build_case_label): Take the LABEL_DECL as input, too.
(genrtl_case_label): Just call add_case_node.
(expand_stmt): Adjust calls to genrtl_return_stmt and
genrtl_case_label.
* c-tree.h (c_expand_start_case): Declare.
* c-typeck.c (decl_constant_value): Give it external linkage.
(c_expand_return): Don't call expand_return or expand_null_return;
use genrtl_return_stmt instead.
* stmt.c (struct nesting): Remove num_ranges field.
(add_case_node): Give it external linkage.
(expand_start_case): Don't set num_ranges.
(expand_start_case_dummy): Don't clear it.
(pushcase): Rely on add_case_node to handle `default' labels.
(add_case_node): Handle `default' labels.
* tree.c (tree_int_cst_compare): New function.
* tree.h (tree_int_cst_compare): Declare.
(add_case_node): Likewise.
* cp-tree.h (push_switch): Change prototype.
(check_cp_case_value): Remove declaration.
(decl_constant_value): Likewise.
* decl.c (struct cp_switch): Add switch_stmt and cases.
(case_compare): New function.
(push_switch): Set switch_stmt. Initialize cases.
(pop_switch): Clean up cases.
(define_case_label): Rename to ...
(finish_case_label): ... this. Do semantic analysis for case
labels here.
(start_function): Correct comment.
* decl2.c (check_cp_case_value): Remove.
* expr.c (do_case): Remove.
* pt.c (tsubst_expr): Adjust call to finish_case_label.
* semantics.c (genrtl_do_poplevel): Remove declaration.
(RECHAIN_STMTS): Remove.
(finish_break_stmt): Use build_break_stmt.
(finish_continue_stmt): Use build_continue_stmt.
(finish_switch_cond): Adjust condition here, rater than in
c_expand_start_case.
(finish_case_label): Remove.
* typeck.c (c_expand_return): Remove.
(c_expand_start_case): Likewise.
From-SVN: r36305
Diffstat (limited to 'gcc/stmt.c')
-rw-r--r-- | gcc/stmt.c | 48 |
1 files changed, 22 insertions, 26 deletions
@@ -240,8 +240,6 @@ struct nesting tree index_expr; /* Type that INDEX_EXPR should be converted to. */ tree nominal_type; - /* Number of range exprs in case statement. */ - int num_ranges; /* Name of this kind of statement, for warnings. */ const char *printname; /* Used to save no_line_numbers till we see the first case label. @@ -421,7 +419,6 @@ static int node_has_high_bound PARAMS ((case_node_ptr, tree)); static int node_is_bounded PARAMS ((case_node_ptr, tree)); static void emit_jump_if_reachable PARAMS ((rtx)); static void emit_case_nodes PARAMS ((rtx, case_node_ptr, rtx, tree)); -static int add_case_node PARAMS ((tree, tree, tree, tree *)); static struct case_node *case_tree2list PARAMS ((case_node *, case_node *)); static void mark_cond_nesting PARAMS ((struct nesting *)); static void mark_loop_nesting PARAMS ((struct nesting *)); @@ -4426,7 +4423,6 @@ expand_start_case (exit_flag, expr, type, printname) thiscase->data.case_stmt.index_expr = expr; thiscase->data.case_stmt.nominal_type = type; thiscase->data.case_stmt.default_label = 0; - thiscase->data.case_stmt.num_ranges = 0; thiscase->data.case_stmt.printname = printname; thiscase->data.case_stmt.line_number_status = force_line_numbers (); case_stack = thiscase; @@ -4464,7 +4460,6 @@ expand_start_case_dummy () thiscase->data.case_stmt.start = 0; thiscase->data.case_stmt.nominal_type = 0; thiscase->data.case_stmt.default_label = 0; - thiscase->data.case_stmt.num_ranges = 0; case_stack = thiscase; nesting_stack = thiscase; start_cleanup_deferral (); @@ -4580,21 +4575,7 @@ pushcase (value, converter, label, duplicate) || ! int_fits_type_p (value, index_type))) return 3; - /* Fail if this is a duplicate or overlaps another entry. */ - if (value == 0) - { - if (case_stack->data.case_stmt.default_label != 0) - { - *duplicate = case_stack->data.case_stmt.default_label; - return 2; - } - case_stack->data.case_stmt.default_label = label; - } - else - return add_case_node (value, value, label, duplicate); - - expand_label (label); - return 0; + return add_case_node (value, value, label, duplicate); } /* Like pushcase but this case applies to all values between VALUE1 and @@ -4670,7 +4651,7 @@ pushcase_range (value1, value2, converter, label, duplicate) into case_stack->data.case_stmt.case_list. Use an AVL tree to avoid slowdown for large switch statements. */ -static int +int add_case_node (low, high, label, duplicate) tree low, high; tree label; @@ -4678,6 +4659,25 @@ add_case_node (low, high, label, duplicate) { struct case_node *p, **q, *r; + /* If there's no HIGH value, then this is not a case range; it's + just a simple case label. But that's just a degenerate case + range. */ + if (!high) + high = low; + + /* Handle default labels specially. */ + if (!high && !low) + { + if (case_stack->data.case_stmt.default_label != 0) + { + *duplicate = case_stack->data.case_stmt.default_label; + return 2; + } + case_stack->data.case_stmt.default_label = label; + expand_label (label); + return 0; + } + q = &case_stack->data.case_stmt.case_list; p = *q; @@ -4709,14 +4709,10 @@ add_case_node (low, high, label, duplicate) r->low = copy_node (low); /* If the bounds are equal, turn this into the one-value case. */ - if (tree_int_cst_equal (low, high)) r->high = r->low; else - { - r->high = copy_node (high); - case_stack->data.case_stmt.num_ranges++; - } + r->high = copy_node (high); r->code_label = label; expand_label (label); |