diff options
author | Jakub Jelinek <jakub@redhat.com> | 2019-02-21 00:01:41 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2019-02-21 00:01:41 +0100 |
commit | cd56fb7957a9b2b685f7dec2db6307bde5a0d4f0 (patch) | |
tree | 07ffe1091210a8bbe5c67b162c409fec3ac87f3d /gcc | |
parent | b2d6c9e88c22c18b1109bb39f265f64fffdbb901 (diff) | |
download | gcc-cd56fb7957a9b2b685f7dec2db6307bde5a0d4f0.zip gcc-cd56fb7957a9b2b685f7dec2db6307bde5a0d4f0.tar.gz gcc-cd56fb7957a9b2b685f7dec2db6307bde5a0d4f0.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/fold-const.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr89091.c | 10 |
4 files changed, 31 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1babbc7..aba3eb8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,4 +1,12 @@ 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/89415 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index fcc1c45..b019a91 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b5e800c..353e4d7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,4 +1,10 @@ 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/89415 diff --git a/gcc/testsuite/gcc.dg/torture/pr89091.c b/gcc/testsuite/gcc.dg/torture/pr89091.c new file mode 100644 index 0000000..9896724 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr89091.c @@ -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; +} |