diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2019-01-24 07:19:49 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2019-01-24 07:19:49 +0000 |
commit | db06a76e9a00cf4ec715a685dd5ca722826f783f (patch) | |
tree | ab6ba45df5faf589744fea7764bd01fa7204d8b7 /gcc/fortran/trans-array.c | |
parent | 52c9cfeb083c7fff0c5049c772285131175f7d0c (diff) | |
download | gcc-db06a76e9a00cf4ec715a685dd5ca722826f783f.zip gcc-db06a76e9a00cf4ec715a685dd5ca722826f783f.tar.gz gcc-db06a76e9a00cf4ec715a685dd5ca722826f783f.tar.bz2 |
re PR fortran/88929 (ICE on building MPICH 3.2 with GCC 9 with ISO_Fortran_binding)
2019-01-24 Paul Thomas <pault@gcc.gnu.org>
PR fortran/88929
* trans-array.c (gfc_conv_descriptor_elem_len): New function.
* trans-array.h : Add prototype for above.
* trans-expr.c (gfc_conv_gfc_desc_to_cfi_desc): Take account of
assumed rank arrays being flagged by rank = -1 in expressions.
Intent in arrays need a pointer to a copy of the data to be
assigned to the descriptor passed for conversion. This should
then be freed, together with the CFI descriptor on return from
the C call.
2019-01-24 Paul Thomas <pault@gcc.gnu.org>
PR fortran/88929
* gfortran.dg/ISO_Fortran_binding_3.f90 : New test
* gfortran.dg/ISO_Fortran_binding_3.c : Subsidiary source.
From-SVN: r268231
Diffstat (limited to 'gcc/fortran/trans-array.c')
-rw-r--r-- | gcc/fortran/trans-array.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 1814916..6d7c3d2 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -285,13 +285,31 @@ gfc_conv_descriptor_rank (tree desc) dtype = gfc_conv_descriptor_dtype (desc); tmp = gfc_advance_chain (TYPE_FIELDS (TREE_TYPE (dtype)), GFC_DTYPE_RANK); - gcc_assert (tmp!= NULL_TREE + gcc_assert (tmp != NULL_TREE && TREE_TYPE (tmp) == signed_char_type_node); return fold_build3_loc (input_location, COMPONENT_REF, TREE_TYPE (tmp), dtype, tmp, NULL_TREE); } +/* Return the element length from the descriptor dtype field. */ + +tree +gfc_conv_descriptor_elem_len (tree desc) +{ + tree tmp; + tree dtype; + + dtype = gfc_conv_descriptor_dtype (desc); + tmp = gfc_advance_chain (TYPE_FIELDS (TREE_TYPE (dtype)), + GFC_DTYPE_ELEM_LEN); + gcc_assert (tmp != NULL_TREE + && TREE_TYPE (tmp) == size_type_node); + return fold_build3_loc (input_location, COMPONENT_REF, TREE_TYPE (tmp), + dtype, tmp, NULL_TREE); +} + + tree gfc_conv_descriptor_attribute (tree desc) { |