From: Jakub Jelinek Date: Wed, 22 Oct 2008 18:21:55 +0000 (+0200) Subject: re PR middle-end/37882 (Bitfield miscompilation) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=972afb58199cd9228dbf974fe0fbd698b430550e;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 484e34014c9..f206c700607 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2008-10-22 Jakub Jelinek + + 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 * tree.def (COMPLEX_TYPE): Constrain element type. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 605caa812e0..88e70d6d5fa 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 76fc9db49ac..2db299781f3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-10-22 Jakub Jelinek + + PR middle-end/37882 + * gcc.c-torture/execute/pr37882.c: New test. + 2008-10-22 Manuel López-Ibáñez 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 00000000000..4a2affa0e58 --- /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; +}