2019-08-30 Jakub Jelinek <jakub@redhat.com>
Backported from mainline
+ 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
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
exp = TREE_OPERAND (exp, 0);
STRIP_NOPS (exp); STRIP_NOPS (and_mask);
if (TREE_CODE (and_mask) != INTEGER_CST)
- return 0;
+ return NULL_TREE;
}
inner = get_inner_reference (exp, pbitsize, pbitpos, &offset, pmode,
|| (! 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;
*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);
2019-08-30 Jakub Jelinek <jakub@redhat.com>
Backported from mainline
+ 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