diff options
author | Martin Liska <mliska@suse.cz> | 2017-03-07 15:12:52 +0100 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2017-03-07 14:12:52 +0000 |
commit | a5e9e3e458eed168c8357a5252d4a6437069a7eb (patch) | |
tree | b1d44627f66da3cd00b3d8b9ca22eb9a53b37eb9 /gcc/tree-chkp.c | |
parent | 5281a167eaf420235edcd5b47425d54a13ff74af (diff) | |
download | gcc-a5e9e3e458eed168c8357a5252d4a6437069a7eb.zip gcc-a5e9e3e458eed168c8357a5252d4a6437069a7eb.tar.gz gcc-a5e9e3e458eed168c8357a5252d4a6437069a7eb.tar.bz2 |
Use array_at_struct_end_p in tree-chkp.c (PR middle-end/68270).
2017-03-07 Martin Liska <mliska@suse.cz>
PR middle-end/68270
* tree-chkp.c (chkp_may_narrow_to_field): Add new argument ref.
Use array_at_struct_end_p instead of DECL_CHAIN (field).
(chkp_narrow_bounds_for_field): Likewise.
(chkp_parse_array_and_component_ref): Pass one more argument to
call.
2017-03-07 Martin Liska <mliska@suse.cz>
PR middle-end/68270
* g++.dg/pr68270.C: New test.
From-SVN: r245951
Diffstat (limited to 'gcc/tree-chkp.c')
-rw-r--r-- | gcc/tree-chkp.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/gcc/tree-chkp.c b/gcc/tree-chkp.c index 02ae2d2..b7b412e 100644 --- a/gcc/tree-chkp.c +++ b/gcc/tree-chkp.c @@ -3266,15 +3266,15 @@ chkp_intersect_bounds (tree bounds1, tree bounds2, gimple_stmt_iterator *iter) } /* Return 1 if we are allowed to narrow bounds for addressed FIELD - and 0 othersize. */ + and 0 othersize. REF is reference to the field. */ + static bool -chkp_may_narrow_to_field (tree field) +chkp_may_narrow_to_field (tree ref, tree field) { return DECL_SIZE (field) && TREE_CODE (DECL_SIZE (field)) == INTEGER_CST && tree_to_uhwi (DECL_SIZE (field)) != 0 && !(flag_chkp_flexible_struct_trailing_arrays - && TREE_CODE(TREE_TYPE(field)) == ARRAY_TYPE - && !DECL_CHAIN (field)) + && array_at_struct_end_p (ref, true)) && (!DECL_FIELD_OFFSET (field) || TREE_CODE (DECL_FIELD_OFFSET (field)) == INTEGER_CST) && (!DECL_FIELD_BIT_OFFSET (field) @@ -3284,14 +3284,15 @@ chkp_may_narrow_to_field (tree field) } /* Return 1 if bounds for FIELD should be narrowed to - field's own size. */ + field's own size. REF is reference to the field. */ + static bool -chkp_narrow_bounds_for_field (tree field) +chkp_narrow_bounds_for_field (tree ref, tree field) { HOST_WIDE_INT offs; HOST_WIDE_INT bit_offs; - if (!chkp_may_narrow_to_field (field)) + if (!chkp_may_narrow_to_field (ref, field)) return false; /* Accesse to compiler generated fields should not cause @@ -3428,7 +3429,8 @@ chkp_parse_array_and_component_ref (tree node, tree *ptr, if (flag_chkp_narrow_bounds && !flag_chkp_narrow_to_innermost_arrray && (!last_comp - || chkp_may_narrow_to_field (TREE_OPERAND (last_comp, 1)))) + || chkp_may_narrow_to_field (var, + TREE_OPERAND (last_comp, 1)))) { comp_to_narrow = last_comp; break; @@ -3440,7 +3442,7 @@ chkp_parse_array_and_component_ref (tree node, tree *ptr, if (innermost_bounds && !array_ref_found - && chkp_narrow_bounds_for_field (field)) + && chkp_narrow_bounds_for_field (var, field)) comp_to_narrow = var; last_comp = var; |