diff options
author | Tobias Burnus <burnus@net-b.de> | 2012-09-17 14:30:16 +0200 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2012-09-17 14:30:16 +0200 |
commit | 640a4c59ed729e48250032b039a5239cd95c1d41 (patch) | |
tree | 7e1a47ffe9d2fe14f016937cb36cf80cd59c0e55 /gcc/fortran/trans-expr.c | |
parent | c6423ef3e00856eb88fb7fceb0f08b6068ddd926 (diff) | |
download | gcc-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.c | 9 |
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); |