diff options
author | Christian Bruel <chrbr@gcc.gnu.org> | 2012-04-19 11:06:53 +0200 |
---|---|---|
committer | Christian Bruel <chrbr@gcc.gnu.org> | 2012-04-19 11:06:53 +0200 |
commit | 007a787db4538b34e254963ee27d43ea48cbb8c6 (patch) | |
tree | a89d5ad3ac4390a00e23584ee2bc15d40c7f3d1a | |
parent | daa573866d655917328caec7debf2175e2a566f8 (diff) | |
download | gcc-007a787db4538b34e254963ee27d43ea48cbb8c6.zip gcc-007a787db4538b34e254963ee27d43ea48cbb8c6.tar.gz gcc-007a787db4538b34e254963ee27d43ea48cbb8c6.tar.bz2 |
Fix #52283 error: case label does not reduce to an integer constant
From-SVN: r186586
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c-family/c-common.c | 1 | ||||
-rw-r--r-- | gcc/convert.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr37985.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr52283.c | 16 |
6 files changed, 40 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f2a9e0a..7f3d9ac 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-04-19 Manuel López-Ibáñez <manu@gcc.gnu.org> + + PR c/52283/37985 + * stmt.c (warn_if_unused_value): Skip NOP_EXPR. + * convert.c (convert_to_integer): Don't set TREE_NO_WARNING. + 2012-04-19 Richard Guenther <rguenther@suse.de> PR rtl-optimization/44688 diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index a08db46..339eefe 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -1692,6 +1692,7 @@ warn_if_unused_value (const_tree exp, location_t locus) case SAVE_EXPR: case NON_LVALUE_EXPR: + case NOP_EXPR: exp = TREE_OPERAND (exp, 0); goto restart; diff --git a/gcc/convert.c b/gcc/convert.c index 8ff2e9a..5e6b09e 100644 --- a/gcc/convert.c +++ b/gcc/convert.c @@ -537,7 +537,6 @@ convert_to_integer (tree type, tree expr) else if (outprec >= inprec) { enum tree_code code; - tree tem; /* If the precision of the EXPR's type is K bits and the destination mode has more bits, and the sign is changing, @@ -555,13 +554,7 @@ convert_to_integer (tree type, tree expr) else code = NOP_EXPR; - tem = fold_unary (code, type, expr); - if (tem) - return tem; - - tem = build1 (code, type, expr); - TREE_NO_WARNING (tem) = 1; - return tem; + return fold_build1 (code, type, expr); } /* If TYPE is an enumeral type or a type with a precision less diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6d9506e..e838343 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2012-04-19 Christian Bruel <christian.bruel@st.com> + + * gcc.dg/pr52283.c: New test. + +2012-04-19 Manuel López-Ibáñez <manu@gcc.gnu.org> + + * gcc.dg/pr37985.c: New test. + 2012-04-19 Richard Guenther <rguenther@suse.de> PR rtl-optimization/44688 diff --git a/gcc/testsuite/gcc.dg/pr37985.c b/gcc/testsuite/gcc.dg/pr37985.c new file mode 100644 index 0000000..93e640b --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr37985.c @@ -0,0 +1,8 @@ +/* PR c37985 */ +/* { dg-do compile } */ +/* { dg-options " -Wall -Wextra " } */ +unsigned char foo(unsigned char a) +{ + a >> 2; /* { dg-warning "no effect" } */ + return a; +} diff --git a/gcc/testsuite/gcc.dg/pr52283.c b/gcc/testsuite/gcc.dg/pr52283.c new file mode 100644 index 0000000..33785a5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr52283.c @@ -0,0 +1,16 @@ +/* Test for case labels not integer constant expressions but folding + to integer constants (used in Linux kernel). */ +/* { dg-do compile } */ + +extern unsigned int u; + +void +b (int c) +{ + switch (c) + { + case (int) (2 | ((4 < 8) ? 8 : u)): + ; + } +} + |