aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorvehre <vehre@138bc75d-0d04-0410-961f-82ee72b054a4>2015-02-06 11:22:54 +0000
committervehre <vehre@138bc75d-0d04-0410-961f-82ee72b054a4>2015-02-06 11:22:54 +0000
commit07fb32323145aa1130a15a731cdd0198c2390d43 (patch)
tree5389ce292f0a5b165c64799355b8af0e1724dcb6 /gcc/fortran
parent74c2de3cc361c1c6aa2fdcbc70e28d6301429ba7 (diff)
PR fortran/60289
Initial patch by Janus Weil * resolve.c (resolve_allocate_expr): Add check for comp. only when target is not unlimited polymorphic. * trans-stmt.c (gfc_trans_allocate): Assign correct value to _len component of unlimited polymorphic entities. * gfortran.dg/unlimited_polymorphic_22.f90: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@220474 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran')
-rw-r--r--gcc/fortran/ChangeLog14
-rw-r--r--gcc/fortran/resolve.c4
-rw-r--r--gcc/fortran/trans-stmt.c11
3 files changed, 27 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index ae912cbe03f..63198c89b7d 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,17 @@
+
+2015-01-29 Andre Vehreschild <vehre@gmx.de>, Janus Weil <janus@gcc.gnu.org>
+
+ PR fortran/60289
+ Initial patch by Janus Weil
+ * resolve.c (resolve_allocate_expr): Add check for comp. only when
+ target is not unlimited polymorphic.
+ * trans-stmt.c (gfc_trans_allocate): Assign correct value to _len
+ component of unlimited polymorphic entities.
+
+2015-01-29 Andre Vehreschild <vehre@gmx.de>
+
+ * gfortran.dg/unlimited_polymorphic_22.f90: New test.
+
2015-02-05 Tobias Burnus <burnus@net-b.de>
PR fortran/64943
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 0b188dad05b..b1111cc4cf5 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -6933,7 +6933,9 @@ resolve_allocate_expr (gfc_expr *e, gfc_code *code)
goto failure;
}
- if (code->ext.alloc.ts.type == BT_CHARACTER && !e->ts.deferred)
+ /* Check F08:C632. */
+ if (code->ext.alloc.ts.type == BT_CHARACTER && !e->ts.deferred
+ && !UNLIMITED_POLY (e))
{
int cmp = gfc_dep_compare_expr (e->ts.u.cl->length,
code->ext.alloc.ts.u.cl->length);
diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c
index 96e5abd6bed..7e0e856b0d0 100644
--- a/gcc/fortran/trans-stmt.c
+++ b/gcc/fortran/trans-stmt.c
@@ -5167,7 +5167,16 @@ gfc_trans_allocate (gfc_code * code)
se_sz.expr = gfc_evaluate_now (se_sz.expr, &se.pre);
gfc_add_block_to_block (&se.pre, &se_sz.post);
/* Store the string length. */
- tmp = al->expr->ts.u.cl->backend_decl;
+ if ((expr->symtree->n.sym->ts.type == BT_CLASS
+ || expr->symtree->n.sym->ts.type == BT_DERIVED)
+ && expr->ts.u.derived->attr.unlimited_polymorphic)
+ /* For unlimited polymorphic entities get the backend_decl of
+ the _len component for that. */
+ tmp = gfc_class_len_get (gfc_get_symbol_decl (
+ expr->symtree->n.sym));
+ else
+ /* Else use what is stored in the charlen->backend_decl. */
+ tmp = al->expr->ts.u.cl->backend_decl;
gfc_add_modify (&se.pre, tmp, fold_convert (TREE_TYPE (tmp),
se_sz.expr));
tmp = TREE_TYPE (gfc_typenode_for_spec (&code->ext.alloc.ts));