diff options
author | Janus Weil <janus@gcc.gnu.org> | 2009-11-18 14:24:54 +0100 |
---|---|---|
committer | Janus Weil <janus@gcc.gnu.org> | 2009-11-18 14:24:54 +0100 |
commit | 827c5be4f719bbd9cbee6d27baaa4276b80e9c1d (patch) | |
tree | e7481856097ba3bd34a1792c5acf2dbc4954abcf /gcc/fortran/trans-expr.c | |
parent | 965b98d04ba5577aaaa2e1e48a8d9ba6dba35da9 (diff) | |
download | gcc-827c5be4f719bbd9cbee6d27baaa4276b80e9c1d.zip gcc-827c5be4f719bbd9cbee6d27baaa4276b80e9c1d.tar.gz gcc-827c5be4f719bbd9cbee6d27baaa4276b80e9c1d.tar.bz2 |
re PR fortran/42072 ([F03] wrong-code with C_F_PROCPOINTER)
2009-11-18 Janus Weil <janus@gcc.gnu.org>
PR fortran/42072
* trans-expr.c (gfc_conv_procedure_call): Handle procedure pointer
dummies which are passed to C_F_PROCPOINTER.
2009-11-18 Janus Weil <janus@gcc.gnu.org>
PR fortran/42072
* gfortran.dg/proc_ptr_8.f90: Extended.
From-SVN: r154292
Diffstat (limited to 'gcc/fortran/trans-expr.c')
-rw-r--r-- | gcc/fortran/trans-expr.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 5a45f4f..b72d540 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -2640,13 +2640,16 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym, gfc_conv_expr (&fptrse, arg->next->expr); gfc_add_block_to_block (&se->pre, &fptrse.pre); gfc_add_block_to_block (&se->post, &fptrse.post); - - if (gfc_is_proc_ptr_comp (arg->next->expr, NULL)) - tmp = gfc_get_ppc_type (arg->next->expr->ref->u.c.component); - else - tmp = TREE_TYPE (arg->next->expr->symtree->n.sym->backend_decl); - se->expr = fold_build2 (MODIFY_EXPR, tmp, fptrse.expr, - fold_convert (tmp, cptrse.expr)); + + if (arg->next->expr->symtree->n.sym->attr.proc_pointer + && arg->next->expr->symtree->n.sym->attr.dummy) + fptrse.expr = build_fold_indirect_ref_loc (input_location, + fptrse.expr); + + se->expr = fold_build2 (MODIFY_EXPR, TREE_TYPE (fptrse.expr), + fptrse.expr, + fold_convert (TREE_TYPE (fptrse.expr), + cptrse.expr)); return 0; } |