aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2015-11-16 20:16:57 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2015-11-16 20:16:57 +0000
commit0f62c7a0cc5b2da41f98c338185dbf036ad468ff (patch)
tree30eed2e1b014356c564af5f4e3c271358eb2fabc /gcc
parent3e6ab828444aad891d84bf68ba02581fba28f80b (diff)
downloadgcc-0f62c7a0cc5b2da41f98c338185dbf036ad468ff.zip
gcc-0f62c7a0cc5b2da41f98c338185dbf036ad468ff.tar.gz
gcc-0f62c7a0cc5b2da41f98c338185dbf036ad468ff.tar.bz2
re PR c++/68362 (ICE: tree check: expected integer_cst, have nop_expr in get_val, at tree.h:5157)
PR c++/68362 * c-common.c (check_case_bounds): Fold low and high cases. * g++.dg/delayedfold/switch-1.C: New test. From-SVN: r230435
Diffstat (limited to 'gcc')
-rw-r--r--gcc/c-family/ChangeLog5
-rw-r--r--gcc/c-family/c-common.c4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/delayedfold/switch-1.C19
4 files changed, 33 insertions, 0 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index e9851aa..3151e34 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,5 +1,10 @@
2015-11-16 Marek Polacek <polacek@redhat.com>
+ PR c++/68362
+ * c-common.c (check_case_bounds): Fold low and high cases.
+
+2015-11-16 Marek Polacek <polacek@redhat.com>
+
* c-ada-spec.c (dump_ada_template): Use RECORD_OR_UNION_TYPE_P.
* c-common.c (c_common_get_alias_set): Likewise.
(handle_visibility_attribute): Likewise.
diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
index a062f81..06d857c 100644
--- a/gcc/c-family/c-common.c
+++ b/gcc/c-family/c-common.c
@@ -3769,6 +3769,10 @@ check_case_bounds (location_t loc, tree type, tree orig_type,
min_value = TYPE_MIN_VALUE (orig_type);
max_value = TYPE_MAX_VALUE (orig_type);
+ /* We'll really need integer constants here. */
+ case_low = fold (case_low);
+ case_high = fold (case_high);
+
/* Case label is less than minimum for type. */
if (tree_int_cst_compare (case_low, min_value) < 0
&& tree_int_cst_compare (case_high, min_value) < 0)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ac40be9..0f6a593 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-11-16 Marek Polacek <polacek@redhat.com>
+
+ PR c++/68362
+ * g++.dg/delayedfold/switch-1.C: New test.
+
2015-11-16 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/58027
diff --git a/gcc/testsuite/g++.dg/delayedfold/switch-1.C b/gcc/testsuite/g++.dg/delayedfold/switch-1.C
new file mode 100644
index 0000000..302da23
--- /dev/null
+++ b/gcc/testsuite/g++.dg/delayedfold/switch-1.C
@@ -0,0 +1,19 @@
+// PR c++/68362
+// { dg-do compile { target c++11 } }
+
+enum class A { foo };
+enum E { bar };
+
+void
+fn1 (const A a)
+{
+ switch (a)
+ case A::foo:;
+}
+
+void
+fn2 (E e)
+{
+ switch (e)
+ case bar:;
+}