summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjb <jb@138bc75d-0d04-0410-961f-82ee72b054a4>2018-01-06 10:41:03 +0000
committerjb <jb@138bc75d-0d04-0410-961f-82ee72b054a4>2018-01-06 10:41:03 +0000
commit08909b0960c878ca445bcd2acc3bc6a056ca779b (patch)
tree4adcbcaed104f34073bffd30cd0f4d866bd98de2
parenta82207f028bf94c0f1623d659112e33c3ad013cb (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/fortran/trans-expr.c4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/char_pointer_assign_icb_1.f9013
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