aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/trans-array.c
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2013-07-22 19:28:56 +0200
committerTobias Burnus <burnus@gcc.gnu.org>2013-07-22 19:28:56 +0200
commit558f3755faa4bc4a15cc4b917d487aca8de09bcb (patch)
treeb1604215f241ce9033caeeb9f75bd4b1338bba15 /gcc/fortran/trans-array.c
parent9ffaa03201577636e08e596570e95b572674681f (diff)
downloadgcc-558f3755faa4bc4a15cc4b917d487aca8de09bcb.zip
gcc-558f3755faa4bc4a15cc4b917d487aca8de09bcb.tar.gz
gcc-558f3755faa4bc4a15cc4b917d487aca8de09bcb.tar.bz2
re PR fortran/57906 (Coarray components: Assignment optimized away (gfortran.dg/coarray/lib_realloc_1.f90))
2013-07-22 Tobias Burnus <burnus@net-b.de> PR fortran/57906 PR fortran/52052 * class.c (gfc_build_class_symbol): Set coarray_comp. * trans-array.c (structure_alloc_comps): For coarrays, directly use the data pointer address. 2013-07-22 Tobias Burnus <burnus@net-b.de> PR fortran/57906 PR fortran/52052 * coarray/lib_realloc_1.f90: Permit optimization. * gfortran.dg/coarray_31.f90: New. From-SVN: r201140
Diffstat (limited to 'gcc/fortran/trans-array.c')
-rw-r--r--gcc/fortran/trans-array.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index 3fdd8d9..0aac678 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -7589,9 +7589,9 @@ structure_alloc_comps (gfc_symbol * der_type, tree decl,
if ((c->ts.type == BT_DERIVED && !c->attr.pointer)
|| (c->ts.type == BT_CLASS && !CLASS_DATA (c)->attr.class_pointer))
- {
- comp = fold_build3_loc (input_location, COMPONENT_REF, ctype,
- decl, cdecl, NULL_TREE);
+ {
+ comp = fold_build3_loc (input_location, COMPONENT_REF, ctype,
+ decl, cdecl, NULL_TREE);
/* The finalizer frees allocatable components. */
called_dealloc_with_status
@@ -7737,8 +7737,17 @@ structure_alloc_comps (gfc_symbol * der_type, tree decl,
cdecl, NULL_TREE);
dcmp = fold_build3_loc (input_location, COMPONENT_REF, ctype, dest,
cdecl, NULL_TREE);
+
if (c->attr.codimension)
- gfc_add_modify (&fnblock, dcmp, comp);
+ {
+ if (c->ts.type == BT_CLASS)
+ {
+ comp = gfc_class_data_get (comp);
+ dcmp = gfc_class_data_get (dcmp);
+ }
+ gfc_conv_descriptor_data_set (&fnblock, dcmp,
+ gfc_conv_descriptor_data_get (comp));
+ }
else
{
tmp = structure_alloc_comps (c->ts.u.derived, comp, dcmp,