summaryrefslogtreecommitdiffstats
path: root/gcc/fortran/trans-expr.c
diff options
context:
space:
mode:
authorpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>2006-12-05 19:32:59 +0000
committerpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>2006-12-05 19:32:59 +0000
commit5065911e23497a49d1d5c81b2eccad2607910392 (patch)
tree86e3992ce63ff1b46d60b5b210ed049b7e036c03 /gcc/fortran/trans-expr.c
parentcfd24df12cc9ae9a286e5272e3f645d496ff61b3 (diff)
downloadppe42-gcc-5065911e23497a49d1d5c81b2eccad2607910392.tar.gz
ppe42-gcc-5065911e23497a49d1d5c81b2eccad2607910392.zip
2006-12-05 Paul Thomas <pault@gcc.gnu.org>
PR fortran/29912 * trans-expr.c (gfc_trans_arrayfunc_assign): Return NULL if the lhs and rhs character lengths are not constant and equal for character array valued functions. 2006-12-05 Paul Thomas <pault@gcc.gnu.org> PR fortran/29912 * gfortran.dg/char_result_12.f90: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@119554 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran/trans-expr.c')
-rw-r--r--gcc/fortran/trans-expr.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index 3505236ab47..7c064ffd827 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -3382,6 +3382,23 @@ gfc_trans_arrayfunc_assign (gfc_expr * expr1, gfc_expr * expr2)
|| expr2->symtree->n.sym->attr.allocatable)
return NULL;
+ /* Character array functions need temporaries unless the
+ character lengths are the same. */
+ if (expr2->ts.type == BT_CHARACTER && expr2->rank > 0)
+ {
+ if (expr1->ts.cl->length == NULL
+ || expr1->ts.cl->length->expr_type != EXPR_CONSTANT)
+ return NULL;
+
+ if (expr2->ts.cl->length == NULL
+ || expr2->ts.cl->length->expr_type != EXPR_CONSTANT)
+ return NULL;
+
+ if (mpz_cmp (expr1->ts.cl->length->value.integer,
+ expr2->ts.cl->length->value.integer) != 0)
+ return NULL;
+ }
+
/* Check that no LHS component references appear during an array
reference. This is needed because we do not have the means to
span any arbitrary stride with an array descriptor. This check
OpenPOWER on IntegriCloud