aboutsummaryrefslogtreecommitdiff
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
parentd89ee6dbda67e1e3efd38cecb003bb2e52b52858 (diff)
downloadgcc-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
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gfortran.dg/pr38868.f2
-rw-r--r--gcc/testsuite/gfortran.dg/pr78758.f9011
-rw-r--r--gcc/tree-object-size.c7
5 files changed, 28 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 93f4556..883bf48 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,9 @@
2016-12-10 Jakub Jelinek <jakub@redhat.com>
+ PR fortran/78758
+ * tree-object-size.c (compute_object_offset) <case ARRAY_REF>: Handle
+ non-zero low bound or non-standard element sizes.
+
PR sanitizer/78708
* lto-streamer-in.c (input_function): In addition to debug stmts
without -g, remove IFN_*SAN_* calls if corresponding flag_sanitize
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6c86182..3760c66 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2016-12-10 Jakub Jelinek <jakub@redhat.com>
+
+ PR fortran/78758
+ * gfortran.dg/pr78758.f90: New test.
+ * gfortran.dg/pr38868.f: Remove again bogus warning.
+
2016-12-09 Paul Thomas <pault@gcc.gnu.org>
PR fortran/77903
diff --git a/gcc/testsuite/gfortran.dg/pr38868.f b/gcc/testsuite/gfortran.dg/pr38868.f
index 583bf90..a8c4469 100644
--- a/gcc/testsuite/gfortran.dg/pr38868.f
+++ b/gcc/testsuite/gfortran.dg/pr38868.f
@@ -9,7 +9,7 @@
ANER(1)='A '
ANER(2)=' '
LINE=' '
- LINE(78:80)='xyz' ! { dg-warning "writing 3 bytes into a region of size 2" }
+ LINE(78:80)='xyz'
WRITE(*,'(A82)') "'"//LINE//"'"
END
diff --git a/gcc/testsuite/gfortran.dg/pr78758.f90 b/gcc/testsuite/gfortran.dg/pr78758.f90
new file mode 100644
index 0000000..3fd3352
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr78758.f90
@@ -0,0 +1,11 @@
+! PR fortran/78758
+! { dg-do compile }
+! { dg-options "-O2 -Wall" }
+
+integer function pr78758 (x)
+ character(len=*), intent(in) :: x
+ character(len=16) :: y
+ integer, external :: z
+ y(2:) = " " // adjustl (x(2:))
+ pr78758 = z (y)
+end function pr78758
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: