re PR fortran/52162 (Bogus -fcheck=bounds with realloc on assignment to unallocated...
authorPaul Thomas <pault@gcc.gnu.org>
Sat, 13 Jan 2018 13:52:34 +0000 (13:52 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Sat, 13 Jan 2018 13:52:34 +0000 (13:52 +0000)
2018-01-13  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/52162
* trans-expr.c (gfc_trans_scalar_assign): Flag is_alloc_lhs if
the rhs expression is neither an elemental nor a conversion
function.

PR fortran/83622
* trans-array.c (is_pointer_array): Remove unconditional return
of false for -fopenmp.

2018-01-13  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/52162
* gfortran.dg/bounds_check_19.f90 : New test.

From-SVN: r256607

gcc/fortran/ChangeLog
gcc/fortran/trans-array.c
gcc/fortran/trans-expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/bounds_check_19.f90 [new file with mode: 0644]

index 8f32e07babf41bad33282fe19ff305061af27804..1e421d9027dba702b18d1269bf7e304ed06384b2 100644 (file)
@@ -1,3 +1,14 @@
+2018-01-13  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/52162
+       * trans-expr.c (gfc_trans_scalar_assign): Flag is_alloc_lhs if
+       the rhs expression is neither an elemental nor a conversion
+       function.
+
+       PR fortran/83622
+       * trans-array.c (is_pointer_array): Remove unconditional return
+       of false for -fopenmp.
+
 2018-01-13  Thomas Koenig <tkoenig@gcc.gnu.org>
        <emsr@gcc.gnu.org>
 
index e35e0c9195fe9b60df09bedaf8a2a4bbc2c8d052..0cf1831802b66692a6920b6ff49dcc7beee7420b 100644 (file)
@@ -786,9 +786,6 @@ gfc_add_ss_to_loop (gfc_loopinfo * loop, gfc_ss * head)
 static bool
 is_pointer_array (tree expr)
 {
-  if (flag_openmp)
-    return false;
-
   if (expr == NULL_TREE
       || !GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (expr))
       || GFC_CLASS_TYPE_P (TREE_TYPE (expr)))
index add0d6991532f0daaa4987d1726b26e8ae5604a7..e90036f43067908f67c0cca741c457d354f19d31 100644 (file)
@@ -9924,9 +9924,12 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag,
   /* Walk the lhs.  */
   lss = gfc_walk_expr (expr1);
   if (gfc_is_reallocatable_lhs (expr1)
-       && !(expr2->expr_type == EXPR_FUNCTION
-            && expr2->value.function.isym != NULL))
+      && !(expr2->expr_type == EXPR_FUNCTION
+          && expr2->value.function.isym != NULL
+          && !(expr2->value.function.isym->elemental
+               || expr2->value.function.isym->conversion)))
     lss->is_alloc_lhs = 1;
+
   rss = NULL;
 
   if ((expr1->ts.type == BT_DERIVED)
index 4463b9b39d02ea3189f5f9dfe5f300cce5e17bd2..04c613fea6e8b0a5a9330ba289327ab80416d6c5 100644 (file)
@@ -1,3 +1,8 @@
+2018-01-13  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/52162
+       * gfortran.dg/bounds_check_19.f90 : New test.
+
 2018-01-12  Jakub Jelinek  <jakub@redhat.com>
 
        * gcc.target/powerpc/float128-hw7.c: Use scan-assembler-times
diff --git a/gcc/testsuite/gfortran.dg/bounds_check_19.f90 b/gcc/testsuite/gfortran.dg/bounds_check_19.f90
new file mode 100644 (file)
index 0000000..21651f1
--- /dev/null
@@ -0,0 +1,24 @@
+! { dg-do run }
+! { dg-options "-fbounds-check" }
+!
+! Test the fix for PR52162 in which the elemental and conversion
+! intrinsics in lines 14 and 19 would cause the bounds check to fail.
+!
+! Contributed by Dominique d'Humieres  <dominiq@lps.ens.fr>
+!
+    integer(4), allocatable :: a(:)
+    integer(8), allocatable :: b(:)
+    real, allocatable :: c(:)
+    allocate (b(7:11), source = [7_8,8_8,9_8,10_8,11_8])
+
+    a = b ! Implicit conversion
+
+    if (lbound (a, 1) .ne. lbound(b, 1)) call abort
+    if (ubound (a, 1) .ne. ubound(b, 1)) call abort
+
+    c = sin(real(b(9:11))/100_8) ! Elemental intrinsic
+
+    if ((ubound(c, 1) - lbound(c, 1)) .ne. 2) call abort
+    if (any (nint(asin(c)*100.0) .ne. b(9:11))) call abort
+    deallocate (a, b, c)
+  end