https://gcc.gnu.org/g:1e97ceb87a03d22d2ad25475333ff16740765a7d
commit 1e97ceb87a03d22d2ad25475333ff16740765a7d 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 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 36c206d5fbbf..ffe56bccc501 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 8a885e0c9c30..226d5263719b 100644 --- a/gcc/fortran/trans-descriptor.cc +++ b/gcc/fortran/trans-descriptor.cc @@ -454,8 +454,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; @@ -464,6 +464,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 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) @@ -479,7 +506,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);