https://gcc.gnu.org/g:514a45251bb7de03483a753f97fa85f6d875355e
commit 514a45251bb7de03483a753f97fa85f6d875355e Author: Mikael Morin <mik...@gcc.gnu.org> Date: Sun Jun 29 14:28:16 2025 +0200 Suppression gfc_conv_descriptor_dimension compil' OK Suppression non_lvalue dimension_get ajout location dimension_set Diff: --- gcc/fortran/trans-array.cc | 10 +++++----- gcc/fortran/trans-descriptor.cc | 35 ++++++++++++++++++++++++++++++++--- gcc/fortran/trans-descriptor.h | 5 ++++- 3 files changed, 41 insertions(+), 9 deletions(-) diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc index b34c8c7bff01..02d6c68b45c5 100644 --- a/gcc/fortran/trans-array.cc +++ b/gcc/fortran/trans-array.cc @@ -8989,11 +8989,11 @@ gfc_conv_array_parameter (gfc_se *se, gfc_expr *expr, bool g77, for (int i = 0; i < expr->rank; i++) { - old_field = gfc_conv_descriptor_dimension (old_desc, - gfc_rank_cst[get_array_ref_dim_for_loop_dim (ss, i)]); - new_field = gfc_conv_descriptor_dimension (new_desc, - gfc_rank_cst[i]); - gfc_add_modify (&se->pre, new_field, old_field); + int idx = get_array_ref_dim_for_loop_dim (ss, i); + old_field = gfc_conv_descriptor_dimension_get (old_desc, idx); + gfc_conv_descriptor_dimension_set (&se->pre, new_desc, i, + old_field); + } if (flag_coarray == GFC_FCOARRAY_LIB diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc index 2a59f7dfd13f..43cfce6f4411 100644 --- a/gcc/fortran/trans-descriptor.cc +++ b/gcc/fortran/trans-descriptor.cc @@ -469,8 +469,8 @@ gfc_get_descriptor_dimension (tree desc) } -tree -gfc_conv_descriptor_dimension (tree desc, tree dim) +static tree +get_descriptor_dimension (tree desc, tree dim) { tree tmp; @@ -479,6 +479,35 @@ gfc_conv_descriptor_dimension (tree desc, tree dim) return gfc_build_array_ref (tmp, dim, NULL_TREE, true); } +tree +gfc_conv_descriptor_dimension_get (tree desc, tree dim) +{ + return get_descriptor_dimension (desc, dim); +} + +tree +gfc_conv_descriptor_dimension_get (tree desc, int dim) +{ + return gfc_conv_descriptor_dimension_get (desc, gfc_rank_cst[dim]); +} + +void +gfc_conv_descriptor_dimension_set (stmtblock_t *block, tree desc, tree dim, + tree value) +{ + location_t loc = input_location; + tree t = get_descriptor_dimension (desc, dim); + gfc_add_modify_loc (loc, block, t, + fold_convert_loc (loc, TREE_TYPE (t), value)); +} + +void +gfc_conv_descriptor_dimension_set (stmtblock_t *block, tree desc, int dim, + tree value) +{ + gfc_conv_descriptor_dimension_set (block, desc, gfc_rank_cst[dim], value); +} + tree gfc_conv_descriptor_token (tree desc) @@ -494,7 +523,7 @@ gfc_conv_descriptor_token (tree desc) static tree gfc_conv_descriptor_subfield (tree desc, tree dim, unsigned field_idx) { - tree tmp = gfc_conv_descriptor_dimension (desc, dim); + tree tmp = get_descriptor_dimension (desc, dim); tree field = gfc_advance_chain (TYPE_FIELDS (TREE_TYPE (tmp)), field_idx); gcc_assert (field != NULL_TREE); diff --git a/gcc/fortran/trans-descriptor.h b/gcc/fortran/trans-descriptor.h index 69cc4f3e2ac6..0547157bf2af 100644 --- a/gcc/fortran/trans-descriptor.h +++ b/gcc/fortran/trans-descriptor.h @@ -49,7 +49,6 @@ tree gfc_get_cfi_dim_sm (tree desc, tree idx); tree gfc_get_descriptor_dimension (tree desc); -tree gfc_conv_descriptor_dimension (tree desc, tree dim); tree gfc_conv_descriptor_token (tree desc); tree gfc_conv_descriptor_data_get (tree desc); @@ -61,6 +60,8 @@ tree gfc_conv_descriptor_rank_get (tree desc); tree gfc_conv_descriptor_type_get (tree desc); tree gfc_conv_descriptor_span_get (tree desc); +tree gfc_conv_descriptor_dimension_get (tree desc, tree dim); +tree gfc_conv_descriptor_dimension_get (tree desc, int dim); tree gfc_conv_descriptor_stride_get (tree desc, tree dim); tree gfc_conv_descriptor_lbound_get (tree desc, tree dim); tree gfc_conv_descriptor_ubound_get (tree desc, tree dim); @@ -77,6 +78,8 @@ void gfc_conv_descriptor_type_set (stmtblock_t *block, tree desc, tree value); tree gfc_conv_descriptor_type_set (tree desc, tree value); tree gfc_conv_descriptor_type_set (tree desc, int value); void gfc_conv_descriptor_span_set (stmtblock_t *block, tree desc, tree value); +void gfc_conv_descriptor_dimension_set (stmtblock_t *block, tree desc, tree dim, tree value); +void gfc_conv_descriptor_dimension_set (stmtblock_t *block, tree desc, int dim, tree value); void gfc_conv_descriptor_stride_set (stmtblock_t *block, tree desc, tree dim, tree value); void gfc_conv_descriptor_lbound_set (stmtblock_t *block, tree desc, tree dim, tree value); void gfc_conv_descriptor_ubound_set (stmtblock_t *block, tree desc, tree dim, tree value);