aboutsummaryrefslogtreecommitdiff
path: root/gcc/go
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2011-02-19 04:36:33 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2011-02-19 04:36:33 +0000
commitd128a6bbe4b50d1c2d035d4cf59b9ab38f398159 (patch)
tree32d03f5dc53f17789a73f4a880d70da14e1f2ca7 /gcc/go
parent6f6961cf116360adc27324d52d6e6a8ccf7c96c2 (diff)
downloadgcc-d128a6bbe4b50d1c2d035d4cf59b9ab38f398159.zip
gcc-d128a6bbe4b50d1c2d035d4cf59b9ab38f398159.tar.gz
gcc-d128a6bbe4b50d1c2d035d4cf59b9ab38f398159.tar.bz2
Don't crash on out of range switch value.
From-SVN: r170305
Diffstat (limited to 'gcc/go')
-rw-r--r--gcc/go/gofrontend/statements.cc7
1 files changed, 6 insertions, 1 deletions
diff --git a/gcc/go/gofrontend/statements.cc b/gcc/go/gofrontend/statements.cc
index bb5a6a0..99ed665 100644
--- a/gcc/go/gofrontend/statements.cc
+++ b/gcc/go/gofrontend/statements.cc
@@ -3212,7 +3212,12 @@ Case_clauses::Case_clause::get_constant_tree(Translate_context* context,
mpz_t ival;
mpz_init(ival);
if (!(*p)->integer_constant_value(true, ival, &itype))
- gcc_unreachable();
+ {
+ // Something went wrong. This can happen with a
+ // negative constant and an unsigned switch value.
+ gcc_assert(saw_errors());
+ continue;
+ }
gcc_assert(itype != NULL);
tree type_tree = itype->get_tree(context->gogo());
tree val = Expression::integer_constant_tree(ival, type_tree);