summaryrefslogtreecommitdiff
path: root/gcc/tree-switch-conversion.c
diff options
context:
space:
mode:
authorjamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4>2008-07-14 11:28:39 +0000
committerjamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4>2008-07-14 11:28:39 +0000
commit1763aab89c33f782d4bc6e117bc4623e2cd13358 (patch)
treebe64e6c5a2aed9974065eba8e46a55f61fee25eb /gcc/tree-switch-conversion.c
parent355d1d37aa3ca1bfc536f4b0156526a33ec45baf (diff)
downloadgcc-1763aab89c33f782d4bc6e117bc4623e2cd13358.tar.gz
2008-07-14 Martin Jambor <mjambor@suse.cz>
* tree-switch-conversion.c (gen_inbound_check): Make sure the type in which we generate arithmetics is not a subrange. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@137783 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-switch-conversion.c')
-rw-r--r--gcc/tree-switch-conversion.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/gcc/tree-switch-conversion.c b/gcc/tree-switch-conversion.c
index 0ce5fc91ead..36c87f9bd51 100644
--- a/gcc/tree-switch-conversion.c
+++ b/gcc/tree-switch-conversion.c
@@ -622,7 +622,7 @@ gen_inbound_check (tree swtch)
tree label_decl3 = create_artificial_label ();
tree label1, label2, label3;
- tree utype = unsigned_type_for (TREE_TYPE (info.index_expr));
+ tree utype;
tree tmp_u;
tree cast, cast_assign;
tree ulb, minus, minus_assign;
@@ -638,6 +638,12 @@ gen_inbound_check (tree swtch)
gcc_assert (info.default_values);
bb0 = bb_for_stmt (swtch);
+ /* Make sure we do not generate arithmetics in a subrange. */
+ if (TREE_TYPE (TREE_TYPE (info.index_expr)))
+ utype = unsigned_type_for (TREE_TYPE (TREE_TYPE (info.index_expr)));
+ else
+ utype = unsigned_type_for (TREE_TYPE (info.index_expr));
+
/* (end of) block 0 */
bsi = bsi_for_stmt (info.arr_ref_first);
tmp_u = make_rename_temp (utype, "csui");