From 972afb58199cd9228dbf974fe0fbd698b430550e Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 22 Oct 2008 20:21:55 +0200 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 +++++++ gcc/fold-const.c | 7 ++++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/execute/pr37882.c | 16 ++++++++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr37882.c 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; +} -- 2.30.2