aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/trans-expr.c
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2012-09-17 14:30:16 +0200
committerTobias Burnus <burnus@gcc.gnu.org>2012-09-17 14:30:16 +0200
commit640a4c59ed729e48250032b039a5239cd95c1d41 (patch)
tree7e1a47ffe9d2fe14f016937cb36cf80cd59c0e55 /gcc/fortran/trans-expr.c
parentc6423ef3e00856eb88fb7fceb0f08b6068ddd926 (diff)
downloadgcc-640a4c59ed729e48250032b039a5239cd95c1d41.zip
gcc-640a4c59ed729e48250032b039a5239cd95c1d41.tar.gz
gcc-640a4c59ed729e48250032b039a5239cd95c1d41.tar.bz2
re PR fortran/54603 ([F03] Wrong code with structure constructor for proc-pointer components)
2012-09-17 Tobias Burnus <burnus@net-b.de> PR fortran/54603 * trans-expr.c (gfc_trans_subcomponent_assign): Handle proc-pointer components. 2012-09-17 Tobias Burnus <burnus@net-b.de> PR fortran/54603 * gfortran.dg/structure_constructor_11.f90: New. From-SVN: r191382
Diffstat (limited to 'gcc/fortran/trans-expr.c')
-rw-r--r--gcc/fortran/trans-expr.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index 84a4b34..98634c3 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -5506,11 +5506,11 @@ gfc_trans_subcomponent_assign (tree dest, gfc_component * cm, gfc_expr * expr)
gfc_start_block (&block);
- if (cm->attr.pointer)
+ if (cm->attr.pointer || cm->attr.proc_pointer)
{
gfc_init_se (&se, NULL);
/* Pointer component. */
- if (cm->attr.dimension)
+ if (cm->attr.dimension && !cm->attr.proc_pointer)
{
/* Array pointer. */
if (expr->expr_type == EXPR_NULL)
@@ -5530,6 +5530,11 @@ gfc_trans_subcomponent_assign (tree dest, gfc_component * cm, gfc_expr * expr)
se.want_pointer = 1;
gfc_conv_expr (&se, expr);
gfc_add_block_to_block (&block, &se.pre);
+
+ if (expr->symtree && expr->symtree->n.sym->attr.proc_pointer
+ && expr->symtree->n.sym->attr.dummy)
+ se.expr = build_fold_indirect_ref_loc (input_location, se.expr);
+
gfc_add_modify (&block, dest,
fold_convert (TREE_TYPE (dest), se.expr));
gfc_add_block_to_block (&block, &se.post);