re PR middle-end/37882 (Bitfield miscompilation)
authorJakub Jelinek <jakub@redhat.com>
Wed, 22 Oct 2008 18:21:55 +0000 (20:21 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 22 Oct 2008 18:21:55 +0000 (20:21 +0200)
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
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr37882.c [new file with mode: 0644]

index 484e34014c9d3d369a369a59210e860d9b214da6..f206c70060770e86e63ec6819610514d2141560f 100644 (file)
@@ -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.
index 605caa812e08df824abea2c21632effe33a338ce..88e70d6d5fa3e6ccfdc5171a1b4d28af47864c5a 100644 (file)
@@ -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,
index 76fc9db49ac44f7429550ce2deb802790b5e8a71..2db299781f3f3c0ed04178a32ec354da881dfdec 100644 (file)
@@ -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 (file)
index 0000000..4a2affa
--- /dev/null
@@ -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;
+}