diff options
author | jb <jb@138bc75d-0d04-0410-961f-82ee72b054a4> | 2018-01-06 10:41:03 +0000 |
---|---|---|
committer | jb <jb@138bc75d-0d04-0410-961f-82ee72b054a4> | 2018-01-06 10:41:03 +0000 |
commit | 08909b0960c878ca445bcd2acc3bc6a056ca779b (patch) | |
tree | 4adcbcaed104f34073bffd30cd0f4d866bd98de2 | |
parent | a82207f028bf94c0f1623d659112e33c3ad013cb (diff) | |
download | gcc-08909b0960c878ca445bcd2acc3bc6a056ca779b.tar.gz |
PR 50892 Latent bug in char pointer assignment
Due to r256284 (PR 78534) there was a latent bug that reared it's head
due to different character length types in the pointer
assignment. Fixed by this patch, which also adds a reduced testcase.
Regtested on x86_64-pc-linux-gnu, committed to trunk as obvious.
gcc/fortran/ChangeLog:
2018-01-06 Janne Blomqvist <jb@gcc.gnu.org>
PR fortran/50892
* trans-expr.c (gfc_trans_pointer_assignment): fold_convert rhs to
lhs type.
gcc/testsuite/ChangeLog:
2018-01-06 Janne Blomqvist <jb@gcc.gnu.org>
PR fortran/50892
* gfortran.dg/char_pointer_assign_icb_1.f90: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@256310 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/trans-expr.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/char_pointer_assign_icb_1.f90 | 13 |
4 files changed, 27 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index b001a8a1845..59ce3d0d210 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2018-01-06 Janne Blomqvist <jb@gcc.gnu.org> + + PR fortran/50892 + * trans-expr.c (gfc_trans_pointer_assignment): fold_convert rhs to + lhs type. + 2018-01-05 Janne Blomqvist <jb@gcc.gnu.org> PR fortran/78534 diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 533435ae0c3..82fe424396d 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -8392,7 +8392,9 @@ gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2) if (expr1->ts.deferred) { if (expr2->expr_type != EXPR_NULL && lse.string_length != NULL) - gfc_add_modify (&block, lse.string_length, rse.string_length); + gfc_add_modify (&block, lse.string_length, + fold_convert (TREE_TYPE (lse.string_length), + rse.string_length)); else if (lse.string_length != NULL) gfc_add_modify (&block, lse.string_length, build_zero_cst (TREE_TYPE (lse.string_length))); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 219d0d4865c..4c2b209f33a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-01-06 Janne Blomqvist <jb@gcc.gnu.org> + + PR fortran/50892 + * gfortran.dg/char_pointer_assign_icb_1.f90: New test. + 2018-01-06 Jakub Jelinek <jakub@redhat.com> PR debug/83480 diff --git a/gcc/testsuite/gfortran.dg/char_pointer_assign_icb_1.f90 b/gcc/testsuite/gfortran.dg/char_pointer_assign_icb_1.f90 new file mode 100644 index 00000000000..966757d21fb --- /dev/null +++ b/gcc/testsuite/gfortran.dg/char_pointer_assign_icb_1.f90 @@ -0,0 +1,13 @@ +! { dg-do compile } +! Reduced testcase from PR 50892, regressed due to r256284 (PR 78534) +subroutine test + use, intrinsic :: ISO_C_Binding, only: c_ptr + type(c_ptr) :: text + character(len=:), pointer :: ftext + ftext => FortranChar(text) +contains + function FortranChar ( C ) + type(c_ptr), intent(in), value :: C + character(len=10), pointer :: FortranChar + end function FortranChar +end subroutine test |