diff options
author | Tobias Burnus <burnus@net-b.de> | 2008-05-25 19:52:03 +0200 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2008-05-25 19:52:03 +0200 |
commit | 5ec81069e5422ce9e606abc35ff3152a9478caf5 (patch) | |
tree | ca93358d5c827cf4f4f0ac92f9cfd0055fc12c0e /gcc/fortran/trans-expr.c | |
parent | fb238648c42ed68efbf890c01cb9631a02455a2a (diff) | |
download | gcc-5ec81069e5422ce9e606abc35ff3152a9478caf5.zip gcc-5ec81069e5422ce9e606abc35ff3152a9478caf5.tar.gz gcc-5ec81069e5422ce9e606abc35ff3152a9478caf5.tar.bz2 |
re PR fortran/32600 ([ISO Bind C] C_F_POINTER w/o SHAPE should not be a library function)
2008-05-25 Tobias Burnus <burnus@net-b.de>
PR fortran/32600
* trans-expr.c (gfc_conv_function_call): Remove library
call for c_f_pointer with scalar Fortran pointers and for
c_f_procpointer.
2008-05-25 Tobias Burnus <burnus@net-b.de>
PR fortran/32600
* intrinsics/iso_c_binding.c (c_f_procpointer): Remove.
* intrinsics/iso_c_binding.h (c_f_procpointer): Remove.
* gfortran.map (c_f_procpointer): Remove.
2008-05-25 Tobias Burnus <burnus@net-b.de>
PR fortran/32600
* gfortran.dg/c_f_pointer_tests_3.f90: New.
From-SVN: r135877
Diffstat (limited to 'gcc/fortran/trans-expr.c')
-rw-r--r-- | gcc/fortran/trans-expr.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 6deaad6..cfd33e4 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -2319,6 +2319,34 @@ gfc_conv_function_call (gfc_se * se, gfc_symbol * sym, return 0; } + else if ((sym->intmod_sym_id == ISOCBINDING_F_POINTER + && arg->next->expr->rank == 0) + || sym->intmod_sym_id == ISOCBINDING_F_PROCPOINTER) + { + /* Convert c_f_pointer if fptr is a scalar + and convert c_f_procpointer. */ + gfc_se cptrse; + gfc_se fptrse; + + gfc_init_se (&cptrse, NULL); + gfc_conv_expr (&cptrse, arg->expr); + gfc_add_block_to_block (&se->pre, &cptrse.pre); + gfc_add_block_to_block (&se->post, &cptrse.post); + + gfc_init_se (&fptrse, NULL); + if (sym->intmod_sym_id == ISOCBINDING_F_POINTER) + fptrse.want_pointer = 1; + + 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); + + tmp = arg->next->expr->symtree->n.sym->backend_decl; + se->expr = fold_build2 (MODIFY_EXPR, TREE_TYPE (tmp), fptrse.expr, + fold_convert (TREE_TYPE (tmp), cptrse.expr)); + + return 0; + } else if (sym->intmod_sym_id == ISOCBINDING_ASSOCIATED) { gfc_se arg1se; |