https://gcc.gnu.org/g:88fd33a12fae9933206a1816455e5a69b671cd98
commit 88fd33a12fae9933206a1816455e5a69b671cd98 Author: Mikael Morin <mik...@gcc.gnu.org> Date: Sun Jun 29 14:28:16 2025 +0200 Suppression gfc_conv_descriptor_dimension compil' OK Diff: --- gcc/fortran/trans-array.cc | 10 +++++----- gcc/fortran/trans-descriptor.cc | 33 ++++++++++++++++++++++++++++++--- gcc/fortran/trans-descriptor.h | 5 ++++- 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc index 5a05031d3b69..af0736300cb5 100644 --- a/gcc/fortran/trans-array.cc +++ b/gcc/fortran/trans-array.cc @@ -8828,11 +8828,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 9f7f50788f65..a05fc1b4b573 100644 --- a/gcc/fortran/trans-descriptor.cc +++ b/gcc/fortran/trans-descriptor.cc @@ -414,8 +414,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; @@ -424,6 +424,33 @@ 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 non_lvalue_loc (input_location, 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) +{ + tree t = get_descriptor_dimension (desc, dim); + gfc_add_modify (block, t, fold_convert (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) @@ -439,7 +466,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 708a340e66d5..d313d9fab175 100644 --- a/gcc/fortran/trans-descriptor.h +++ b/gcc/fortran/trans-descriptor.h @@ -30,7 +30,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); @@ -42,6 +41,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); @@ -55,6 +56,8 @@ void gfc_conv_descriptor_version_set (stmtblock_t *block, tree desc, tree value) void gfc_conv_descriptor_rank_set (stmtblock_t *block, tree desc, tree value); void gfc_conv_descriptor_rank_set (stmtblock_t *block, 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);