aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/fortran/ChangeLog8
-rw-r--r--gcc/fortran/resolve.c3
-rw-r--r--gcc/fortran/trans-expr.c4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/deferred_character_32.f9013
5 files changed, 32 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 3b5028c..f03302e 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,13 @@
2019-02-23 Paul Thomas <pault@gcc.gnu.org>
+ PR fortran/88117
+ * resolve.c (deferred_op_assign): Return if the lhs expression
+ has the pointer attribute.
+ * trans-expr.c (gfc_trans_assignment_1): Do not fix the string
+ length if the lhs expression has the pointer attribute.
+
+2019-02-23 Paul Thomas <pault@gcc.gnu.org>
+
PR fortran/89385
PR fortran/89366
* decl.c (gfc_verify_c_interop_param): Restriction on string
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index e581a60..422cec2 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -11166,6 +11166,9 @@ deferred_op_assign (gfc_code **code, gfc_namespace *ns)
if (!gfc_check_dependency ((*code)->expr1, (*code)->expr2, 1))
return false;
+ if (gfc_expr_attr ((*code)->expr1).pointer)
+ return false;
+
tmp_expr = get_temp_from_expr ((*code)->expr1, ns);
tmp_expr->where = (*code)->loc;
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index cff3d7c..a865cd6 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -10579,7 +10579,9 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag,
string_length = gfc_evaluate_now (rse.string_length, &rse.pre);
else if (expr2->ts.type == BT_CHARACTER)
{
- if (expr1->ts.deferred && gfc_check_dependency (expr1, expr2, true))
+ if (expr1->ts.deferred
+ && gfc_expr_attr (expr1).allocatable
+ && gfc_check_dependency (expr1, expr2, true))
rse.string_length = gfc_evaluate_now (rse.string_length, &rse.pre);
string_length = rse.string_length;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0d1cdec..cc5a87d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2019-02-23 Paul Thomas <pault@gcc.gnu.org>
+ PR fortran/88117
+ * gfortran.dg/deferred_character_32.f90 : New test
+
+2019-02-23 Paul Thomas <pault@gcc.gnu.org>
+
PR fortran/89385
* gfortran.dg/ISO_Fortran_binding_1.f90 : Correct test for
previously incorrect lbound for allocatable expressions. Also
diff --git a/gcc/testsuite/gfortran.dg/deferred_character_32.f90 b/gcc/testsuite/gfortran.dg/deferred_character_32.f90
new file mode 100644
index 0000000..3969d97
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/deferred_character_32.f90
@@ -0,0 +1,13 @@
+! { dg-do run }
+!
+! Test the fix for PR88117.
+!
+! Contributed by Gerhard Steinmetz <gscfq@t-online.de>
+!
+program p
+ character(:), pointer :: z(:)
+ allocate (z, source = ['abcd', 'bcde'])
+ z = (z) ! gimplifier choked here.
+ if (any (z .ne. ['abcd', 'bcde'])) stop 1
+ deallocate (z)
+end