diff options
author | Jakub Jelinek <jakub@redhat.com> | 2016-12-10 09:02:21 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-12-10 09:02:21 +0100 |
commit | 2d4102c5cbe74a27b7ec64e3d90404e3d3707b6f (patch) | |
tree | ed5bebc41f71dbb9725b566add5765cfd89508a5 /gcc/tree-object-size.c | |
parent | d89ee6dbda67e1e3efd38cecb003bb2e52b52858 (diff) | |
download | gcc-2d4102c5cbe74a27b7ec64e3d90404e3d3707b6f.zip gcc-2d4102c5cbe74a27b7ec64e3d90404e3d3707b6f.tar.gz gcc-2d4102c5cbe74a27b7ec64e3d90404e3d3707b6f.tar.bz2 |
re PR fortran/78758 (Warning: '__builtin_memcpy' ... overflows the destination for string assignment)
PR fortran/78758
* tree-object-size.c (compute_object_offset) <case ARRAY_REF>: Handle
non-zero low bound or non-standard element sizes.
* gfortran.dg/pr78758.f90: New test.
* gfortran.dg/pr38868.f: Remove again bogus warning.
From-SVN: r243515
Diffstat (limited to 'gcc/tree-object-size.c')
-rw-r--r-- | gcc/tree-object-size.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/gcc/tree-object-size.c b/gcc/tree-object-size.c index 1317ad7..0fae183 100644 --- a/gcc/tree-object-size.c +++ b/gcc/tree-object-size.c @@ -138,13 +138,18 @@ compute_object_offset (const_tree expr, const_tree var) return base; t = TREE_OPERAND (expr, 1); + tree low_bound, unit_size; + low_bound = array_ref_low_bound (CONST_CAST_TREE (expr)); + unit_size = array_ref_element_size (CONST_CAST_TREE (expr)); + if (! integer_zerop (low_bound)) + t = fold_build2 (MINUS_EXPR, TREE_TYPE (t), t, low_bound); if (TREE_CODE (t) == INTEGER_CST && tree_int_cst_sgn (t) < 0) { code = MINUS_EXPR; t = fold_build1 (NEGATE_EXPR, TREE_TYPE (t), t); } t = fold_convert (sizetype, t); - off = size_binop (MULT_EXPR, TYPE_SIZE_UNIT (TREE_TYPE (expr)), t); + off = size_binop (MULT_EXPR, unit_size, t); break; case MEM_REF: |