diff options
author | Jakub Jelinek <jakub@redhat.com> | 2008-10-22 20:21:55 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2008-10-22 20:21:55 +0200 |
commit | 972afb58199cd9228dbf974fe0fbd698b430550e (patch) | |
tree | f6e3ecababdb7c9cb2c4fa8858443e73e6840f66 /gcc | |
parent | 58ddc179d494fd426aca184a1a5749d9fa6f81b9 (diff) | |
download | gcc-972afb58199cd9228dbf974fe0fbd698b430550e.zip gcc-972afb58199cd9228dbf974fe0fbd698b430550e.tar.gz gcc-972afb58199cd9228dbf974fe0fbd698b430550e.tar.bz2 |
re PR middle-end/37882 (Bitfield miscompilation)
PR middle-end/37882
* fold-const.c (build_range_type): For 1 .. signed_max
range call build_nonstandard_inter_type if signed_type_for
returned a type with bigger precision.
* gcc.c-torture/execute/pr37882.c: New test.
From-SVN: r141303
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fold-const.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/pr37882.c | 16 |
4 files changed, 34 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 484e340..f206c70 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2008-10-22 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/37882 + * fold-const.c (build_range_type): For 1 .. signed_max + range call build_nonstandard_inter_type if signed_type_for + returned a type with bigger precision. + 2008-10-22 Richard Guenther <rguenther@suse.de> * tree.def (COMPLEX_TYPE): Constrain element type. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 605caa8..88e70d6 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -4503,7 +4503,12 @@ build_range_check (tree type, tree exp, int in_p, tree low, tree high) { if (TYPE_UNSIGNED (etype)) { - etype = signed_type_for (etype); + tree signed_etype = signed_type_for (etype); + if (TYPE_PRECISION (signed_etype) != TYPE_PRECISION (etype)) + etype + = build_nonstandard_integer_type (TYPE_PRECISION (etype), 0); + else + etype = signed_etype; exp = fold_convert (etype, exp); } return fold_build2 (GT_EXPR, type, exp, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 76fc9db..2db2997 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-10-22 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/37882 + * gcc.c-torture/execute/pr37882.c: New test. + 2008-10-22 Manuel López-Ibáñez <manu@gcc.gnu.org> PR c/30949 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr37882.c b/gcc/testsuite/gcc.c-torture/execute/pr37882.c new file mode 100644 index 0000000..4a2affa --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr37882.c @@ -0,0 +1,16 @@ +/* PR middle-end/37882 */ + +struct S +{ + int a : 21; + unsigned char b : 3; +} s; + +int +main () +{ + s.b = 4; + if (s.b > 0 && s.b < 4) + __builtin_abort (); + return 0; +} |