aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2007-09-21 15:02:44 +0000
committerPaul Thomas <pault@gcc.gnu.org>2007-09-21 15:02:44 +0000
commitda6b49e17b737fdb11968172e02d08aa980080e7 (patch)
treecbee7322eb42d62fa08adb164300a6accb5efc26 /gcc
parent9723778490b9963e98658dc82a5f48b291cfe67a (diff)
downloadgcc-da6b49e17b737fdb11968172e02d08aa980080e7.zip
gcc-da6b49e17b737fdb11968172e02d08aa980080e7.tar.gz
gcc-da6b49e17b737fdb11968172e02d08aa980080e7.tar.bz2
trans-expr.c (gfc_trans_pointer_assignment): Convert array descriptor for subref pointer assignements...
2007-09-21 Paul Thomas <pault@gcc.gnu.org> *trans-expr.c (gfc_trans_pointer_assignment): Convert array descriptor for subref pointer assignements, rather than using the loop info version. From-SVN: r128651
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/trans-expr.c13
2 files changed, 14 insertions, 5 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index def238f..586c719 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2007-09-21 Paul Thomas <pault@gcc.gnu.org>
+
+ *trans-expr.c (gfc_trans_pointer_assignment): Convert array
+ descriptor for subref pointer assignements, rather than using
+ the loop info version.
+
2007-09-21 Tobias Burnus <burnus@net-b.de>
PR fortran/33037
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index f5d7c65..dff1fd8 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -3499,14 +3499,17 @@ gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2)
gfc_conv_expr_descriptor (&lse, expr2, rss);
/* If this is a subreference array pointer assignment, use the rhs
- element size for the lhs span. */
+ descriptor element size for the lhs span. */
if (expr1->symtree->n.sym->attr.subref_array_pointer)
{
decl = expr1->symtree->n.sym->backend_decl;
- tmp = rss->data.info.descriptor;
- tmp = gfc_get_element_type (TREE_TYPE (tmp));
- tmp = size_in_bytes (tmp);
- tmp = fold_convert (gfc_array_index_type, tmp);
+ gfc_init_se (&rse, NULL);
+ rse.descriptor_only = 1;
+ gfc_conv_expr (&rse, expr2);
+ tmp = gfc_get_element_type (TREE_TYPE (rse.expr));
+ tmp = fold_convert (gfc_array_index_type, size_in_bytes (tmp));
+ if (!INTEGER_CST_P (tmp))
+ gfc_add_block_to_block (&lse.post, &rse.pre);
gfc_add_modify_expr (&lse.post, GFC_DECL_SPAN(decl), tmp);
}