re PR fortran/87045 (pointer to array of character)
authorHarald Anlauf <anlauf@gmx.de>
Wed, 13 Mar 2019 21:33:27 +0000 (21:33 +0000)
committerHarald Anlauf <anlauf@gcc.gnu.org>
Wed, 13 Mar 2019 21:33:27 +0000 (21:33 +0000)
2019-03-13  Harald Anlauf  <anlauf@gmx.de>

PR fortran/87045
* trans-expr.c (gfc_trans_pointer_assignment): Move check for same
string length so that we do not get false errors for deferred
length.

PR fortran/87045
* gfortran.dg/pr87045.f90: New test.

From-SVN: r269664

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

index 281c29f..8264e59 100644 (file)
@@ -1,3 +1,10 @@
+2019-03-13  Harald Anlauf  <anlauf@gmx.de>
+
+       PR fortran/87045
+       * trans-expr.c (gfc_trans_pointer_assignment): Move check for same
+       string length so that we do not get false errors for deferred
+       length.
+
 2019-03-13  Janus Weil  <janus@gcc.gnu.org>
 
        PR fortran/89601
index 9019c55..9575f39 100644 (file)
@@ -9278,16 +9278,6 @@ gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2)
            }
        }
 
-      /* Check string lengths if applicable.  The check is only really added
-        to the output code if -fbounds-check is enabled.  */
-      if (expr1->ts.type == BT_CHARACTER && expr2->expr_type != EXPR_NULL)
-       {
-         gcc_assert (expr2->ts.type == BT_CHARACTER);
-         gcc_assert (strlen_lhs && strlen_rhs);
-         gfc_trans_same_strlen_check ("pointer assignment", &expr1->where,
-                                      strlen_lhs, strlen_rhs, &block);
-       }
-
       /* If rank remapping was done, check with -fcheck=bounds that
         the target is at least as large as the pointer.  */
       if (rank_remap && (gfc_option.rtcheck & GFC_RTCHECK_BOUNDS))
@@ -9322,6 +9312,16 @@ gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2)
            gfc_add_modify (&block, tmp, build_zero_cst (TREE_TYPE (tmp)));
        }
 
+      /* Check string lengths if applicable.  The check is only really added
+        to the output code if -fbounds-check is enabled.  */
+      if (expr1->ts.type == BT_CHARACTER && expr2->expr_type != EXPR_NULL)
+       {
+         gcc_assert (expr2->ts.type == BT_CHARACTER);
+         gcc_assert (strlen_lhs && strlen_rhs);
+         gfc_trans_same_strlen_check ("pointer assignment", &expr1->where,
+                                      strlen_lhs, strlen_rhs, &block);
+       }
+
       gfc_add_block_to_block (&block, &lse.post);
       if (rank_remap)
        gfc_add_block_to_block (&block, &rse.post);
index f4d25f1..b7550a2 100644 (file)
@@ -1,3 +1,8 @@
+2019-03-13  Harald Anlauf  <anlauf@gmx.de>
+
+       PR fortran/87045
+       * gfortran.dg/pr87045.f90: New test.
+
 2019-03-13  Vladimir Makarov  <vmakarov@redhat.com>
 
        PR target/85860
diff --git a/gcc/testsuite/gfortran.dg/pr87045.f90 b/gcc/testsuite/gfortran.dg/pr87045.f90
new file mode 100644 (file)
index 0000000..46b11f9
--- /dev/null
@@ -0,0 +1,19 @@
+! { dg-do run }
+! { dg-additional-options "-fcheck=bounds" }
+!
+! PR fortran/87045 - pointer to array of character
+! Contributed by Valery Weber
+! This used to give an invalid run-time error
+
+program test
+  character(:), dimension(:), allocatable, target :: t
+  character(:), pointer, dimension(:) :: p
+  allocate( character(3) :: t(2) )
+  t(1) = "abc"
+  t(2) = "123"
+  p => t
+  if (size (p) /= 2) stop 1
+  if (len  (p) /= 3) stop 2
+  if (p(1) /= "abc") stop 3
+  if (p(2) /= "123") stop 4
+end program test