Commit edaff7c9 by Harald Anlauf Committed by Harald Anlauf

re PR fortran/87045 (pointer to array of character)

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
parent 1e05d185
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> 2019-03-13 Janus Weil <janus@gcc.gnu.org>
PR fortran/89601 PR fortran/89601
......
...@@ -9278,16 +9278,6 @@ gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2) ...@@ -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 /* If rank remapping was done, check with -fcheck=bounds that
the target is at least as large as the pointer. */ the target is at least as large as the pointer. */
if (rank_remap && (gfc_option.rtcheck & GFC_RTCHECK_BOUNDS)) if (rank_remap && (gfc_option.rtcheck & GFC_RTCHECK_BOUNDS))
...@@ -9322,6 +9312,16 @@ gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2) ...@@ -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))); 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); gfc_add_block_to_block (&block, &lse.post);
if (rank_remap) if (rank_remap)
gfc_add_block_to_block (&block, &rse.post); gfc_add_block_to_block (&block, &rse.post);
......
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> 2019-03-13 Vladimir Makarov <vmakarov@redhat.com>
PR target/85860 PR target/85860
......
! { 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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment