diff options
author | Tobias Burnus <tobias@codesourcery.com> | 2019-10-28 07:33:29 +0000 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2019-10-28 08:33:29 +0100 |
commit | 1c02794484c358b1b69363c164ecc39df967eca5 (patch) | |
tree | 906496c3f83650aed85ca5d8f9431a882b87ab05 /gcc/fortran/trans-expr.c | |
parent | 6d099a76a0f6a040a3e678f2bce7fc69cc3257d8 (diff) | |
download | gcc-1c02794484c358b1b69363c164ecc39df967eca5.zip gcc-1c02794484c358b1b69363c164ecc39df967eca5.tar.gz gcc-1c02794484c358b1b69363c164ecc39df967eca5.tar.bz2 |
Fortran] PR91863 - fix call to bind(C) with array descriptor
PR fortran/91863
* trans-expr.c (gfc_conv_gfc_desc_to_cfi_desc): Don't free data
memory as that's done on the Fortran side.
(gfc_conv_procedure_call): Handle void* pointers from
gfc_conv_gfc_desc_to_cfi_desc.
PR fortran/91863
* gfortran.dg/bind-c-intent-out.f90: New.
From-SVN: r277502
Diffstat (limited to 'gcc/fortran/trans-expr.c')
-rw-r--r-- | gcc/fortran/trans-expr.c | 23 |
1 files changed, 8 insertions, 15 deletions
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 65238ff..7eba1bb 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -5206,7 +5206,6 @@ gfc_conv_gfc_desc_to_cfi_desc (gfc_se *parmse, gfc_expr *e, gfc_symbol *fsym) int attribute; int cfi_attribute; symbol_attribute attr = gfc_expr_attr (e); - stmtblock_t block; /* If this is a full array or a scalar, the allocatable and pointer attributes can be passed. Otherwise it is 'CFI_attribute_other'*/ @@ -5325,18 +5324,6 @@ gfc_conv_gfc_desc_to_cfi_desc (gfc_se *parmse, gfc_expr *e, gfc_symbol *fsym) /* The CFI descriptor is passed to the bind_C procedure. */ parmse->expr = cfi_desc_ptr; - /* Free the CFI descriptor. */ - gfc_init_block (&block); - cond = fold_build2_loc (input_location, NE_EXPR, - logical_type_node, cfi_desc_ptr, - build_int_cst (TREE_TYPE (cfi_desc_ptr), 0)); - tmp = gfc_call_free (cfi_desc_ptr); - gfc_add_expr_to_block (&block, tmp); - tmp = build3_v (COND_EXPR, cond, - gfc_finish_block (&block), - build_empty_stmt (input_location)); - gfc_prepend_expr_to_block (&parmse->post, tmp); - /* Transfer values back to gfc descriptor. */ tmp = gfc_build_addr_expr (NULL_TREE, parmse->expr); tmp = build_call_expr_loc (input_location, @@ -6250,8 +6237,14 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym, gfc_add_expr_to_block (&se->pre, tmp); } - tmp = build_fold_indirect_ref_loc (input_location, - parmse.expr); + tmp = parmse.expr; + /* With bind(C), the actual argument is replaced by a bind-C + descriptor; in this case, the data component arrives here, + which shall not be dereferenced, but still freed and + nullified. */ + if (TREE_TYPE(tmp) != pvoid_type_node) + tmp = build_fold_indirect_ref_loc (input_location, + parmse.expr); if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (tmp))) tmp = gfc_conv_descriptor_data_get (tmp); tmp = gfc_deallocate_with_status (tmp, NULL_TREE, NULL_TREE, |