Commit cd56fb79 by Jakub Jelinek Committed by Jakub Jelinek

re PR middle-end/89091 (ICE: Segmentation fault (in tree_class_check))

	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
parent b2d6c9e8
2019-02-20 Jakub Jelinek <jakub@redhat.com> 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 PR middle-end/88074
PR middle-end/89415 PR middle-end/89415
......
...@@ -4280,7 +4280,7 @@ decode_field_reference (location_t loc, tree *exp_, HOST_WIDE_INT *pbitsize, ...@@ -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 There are problems with FP fields since the type_for_size call
below can fail for, e.g., XFmode. */ below can fail for, e.g., XFmode. */
if (! INTEGRAL_TYPE_P (TREE_TYPE (exp))) if (! INTEGRAL_TYPE_P (TREE_TYPE (exp)))
return 0; return NULL_TREE;
/* We are interested in the bare arrangement of bits, so strip everything /* 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 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, ...@@ -4296,7 +4296,7 @@ decode_field_reference (location_t loc, tree *exp_, HOST_WIDE_INT *pbitsize,
exp = TREE_OPERAND (exp, 0); exp = TREE_OPERAND (exp, 0);
STRIP_NOPS (exp); STRIP_NOPS (and_mask); STRIP_NOPS (exp); STRIP_NOPS (and_mask);
if (TREE_CODE (and_mask) != INTEGER_CST) if (TREE_CODE (and_mask) != INTEGER_CST)
return 0; return NULL_TREE;
} }
poly_int64 poly_bitsize, poly_bitpos; poly_int64 poly_bitsize, poly_bitpos;
...@@ -4312,7 +4312,11 @@ decode_field_reference (location_t loc, tree *exp_, HOST_WIDE_INT *pbitsize, ...@@ -4312,7 +4312,11 @@ decode_field_reference (location_t loc, tree *exp_, HOST_WIDE_INT *pbitsize,
|| (! AGGREGATE_TYPE_P (TREE_TYPE (inner)) || (! AGGREGATE_TYPE_P (TREE_TYPE (inner))
&& compare_tree_int (TYPE_SIZE (TREE_TYPE (inner)), && compare_tree_int (TYPE_SIZE (TREE_TYPE (inner)),
*pbitpos + *pbitsize) < 0)) *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; *exp_ = exp;
...@@ -4323,7 +4327,6 @@ decode_field_reference (location_t loc, tree *exp_, HOST_WIDE_INT *pbitsize, ...@@ -4323,7 +4327,6 @@ decode_field_reference (location_t loc, tree *exp_, HOST_WIDE_INT *pbitsize,
*punsignedp = TYPE_UNSIGNED (outer_type); *punsignedp = TYPE_UNSIGNED (outer_type);
/* Compute the mask to access the bitfield. */ /* Compute the mask to access the bitfield. */
unsigned_type = lang_hooks.types.type_for_size (*pbitsize, 1);
precision = TYPE_PRECISION (unsigned_type); precision = TYPE_PRECISION (unsigned_type);
mask = build_int_cst_type (unsigned_type, -1); mask = build_int_cst_type (unsigned_type, -1);
......
2019-02-20 Jakub Jelinek <jakub@redhat.com> 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 PR middle-end/88074
PR middle-end/89415 PR middle-end/89415
......
/* 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment