summaryrefslogtreecommitdiff
path: root/gcc/tree-object-size.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-12-10 09:02:21 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2016-12-10 09:02:21 +0100
commit2d4102c5cbe74a27b7ec64e3d90404e3d3707b6f (patch)
treeed5bebc41f71dbb9725b566add5765cfd89508a5 /gcc/tree-object-size.c
parentd89ee6dbda67e1e3efd38cecb003bb2e52b52858 (diff)
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.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/gcc/tree-object-size.c b/gcc/tree-object-size.c
index 1317ad7ee9a..0fae183b330 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: