aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-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: