re PR middle-end/89091 (ICE: Segmentation fault (in tree_class_check))
authorJakub Jelinek <jakub@redhat.com>
Wed, 20 Feb 2019 23:01:41 +0000 (00:01 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 20 Feb 2019 23:01:41 +0000 (00:01 +0100)
PR middle-end/89091
* fold-const.c (decode_field_reference): Return NULL_TREE if
lang_hooks.types.type_for_size returns NULL.  Check it before
overwriting *exp_.  Use return NULL_TREE instead of return 0.

* gcc.dg/torture/pr89091.c: New test.

Co-Authored-By: David Malcolm <dmalcolm@redhat.com>
From-SVN: r269056

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr89091.c [new file with mode: 0644]

index 1babbc7c036964cc3a679e763f00f8ef56d7e4e2..aba3eb8419d318a0b4d4c0e429aed4de2b0821f0 100644 (file)
@@ -1,3 +1,11 @@
+2019-02-20  Jakub Jelinek  <jakub@redhat.com>
+           David Malcolm  <dmalcolm@redhat.com>
+
+       PR middle-end/89091
+       * fold-const.c (decode_field_reference): Return NULL_TREE if
+       lang_hooks.types.type_for_size returns NULL.  Check it before
+       overwriting *exp_.  Use return NULL_TREE instead of return 0.
+
 2019-02-20  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/88074
index fcc1c450129427926165e5ea11700435e053f885..b019a910839c68457436ff051fdf5e4335108796 100644 (file)
@@ -4280,7 +4280,7 @@ decode_field_reference (location_t loc, tree *exp_, HOST_WIDE_INT *pbitsize,
      There are problems with FP fields since the type_for_size call
      below can fail for, e.g., XFmode.  */
   if (! INTEGRAL_TYPE_P (TREE_TYPE (exp)))
-    return 0;
+    return NULL_TREE;
 
   /* We are interested in the bare arrangement of bits, so strip everything
      that doesn't affect the machine mode.  However, record the type of the
@@ -4296,7 +4296,7 @@ decode_field_reference (location_t loc, tree *exp_, HOST_WIDE_INT *pbitsize,
       exp = TREE_OPERAND (exp, 0);
       STRIP_NOPS (exp); STRIP_NOPS (and_mask);
       if (TREE_CODE (and_mask) != INTEGER_CST)
-       return 0;
+       return NULL_TREE;
     }
 
   poly_int64 poly_bitsize, poly_bitpos;
@@ -4312,7 +4312,11 @@ decode_field_reference (location_t loc, tree *exp_, HOST_WIDE_INT *pbitsize,
       || (! AGGREGATE_TYPE_P (TREE_TYPE (inner))
          && compare_tree_int (TYPE_SIZE (TREE_TYPE (inner)),
                               *pbitpos + *pbitsize) < 0))
-    return 0;
+    return NULL_TREE;
+
+  unsigned_type = lang_hooks.types.type_for_size (*pbitsize, 1);
+  if (unsigned_type == NULL_TREE)
+    return NULL_TREE;
 
   *exp_ = exp;
 
@@ -4323,7 +4327,6 @@ decode_field_reference (location_t loc, tree *exp_, HOST_WIDE_INT *pbitsize,
     *punsignedp = TYPE_UNSIGNED (outer_type);
 
   /* Compute the mask to access the bitfield.  */
-  unsigned_type = lang_hooks.types.type_for_size (*pbitsize, 1);
   precision = TYPE_PRECISION (unsigned_type);
 
   mask = build_int_cst_type (unsigned_type, -1);
index b5e800c68e1c09e99abc9b4d4e09549a9fe4695b..353e4d704a746e4b501d2df0922f797219d1d6ee 100644 (file)
@@ -1,3 +1,9 @@
+2019-02-20  Jakub Jelinek  <jakub@redhat.com>
+           David Malcolm  <dmalcolm@redhat.com>
+
+       PR middle-end/89091
+       * gcc.dg/torture/pr89091.c: New test.
+
 2019-02-20  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/88074
diff --git a/gcc/testsuite/gcc.dg/torture/pr89091.c b/gcc/testsuite/gcc.dg/torture/pr89091.c
new file mode 100644 (file)
index 0000000..9896724
--- /dev/null
@@ -0,0 +1,10 @@
+/* PR middle-end/89091 */
+/* { dg-do compile { target int128 } } */
+
+struct S { unsigned __int128 s : 65; };
+
+int
+foo (struct S *x, int y)
+{
+  return y && x->s;
+}