https://gcc.gnu.org/g:27e89f24feae3c86777062a73d5f69b9140dc2a7
commit 27e89f24feae3c86777062a73d5f69b9140dc2a7 Author: Mikael Morin <mik...@gcc.gnu.org> Date: Sun Jun 29 14:07:23 2025 +0200 Suppression gfc_conv_descriptor_rank compil' OK Diff: --- gcc/fortran/trans-array.cc | 16 ++++++---------- gcc/fortran/trans-decl.cc | 2 +- gcc/fortran/trans-descriptor.cc | 22 ++++++++++++++++++++-- gcc/fortran/trans-descriptor.h | 4 +++- gcc/fortran/trans-expr.cc | 24 +++++++----------------- gcc/fortran/trans-intrinsic.cc | 10 +++++----- gcc/fortran/trans-openmp.cc | 2 +- gcc/fortran/trans-stmt.cc | 2 +- 8 files changed, 44 insertions(+), 38 deletions(-) diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc index a301b0d06aa6..5a05031d3b69 100644 --- a/gcc/fortran/trans-array.cc +++ b/gcc/fortran/trans-array.cc @@ -1192,9 +1192,7 @@ gfc_trans_create_temp_array (stmtblock_t * pre, stmtblock_t * post, gfc_ss * ss, /* These transformational functions change the rank. */ - tmp = gfc_conv_descriptor_rank (desc); - gfc_add_modify (pre, tmp, - build_int_cst (TREE_TYPE (tmp), ss->loop->dimen)); + gfc_conv_descriptor_rank_set (pre, desc, ss->loop->dimen); fcn_ss->info->class_container = NULL_TREE; } @@ -4669,7 +4667,7 @@ done: && (gfc_option.allow_std & GFC_STD_F202Y))) gcc_assert (se.pre.head == NULL_TREE && se.post.head == NULL_TREE); - rank = gfc_conv_descriptor_rank (se.expr); + rank = gfc_conv_descriptor_rank_get (se.expr); tmp = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type, fold_convert (gfc_array_index_type, @@ -8267,7 +8265,7 @@ gfc_tree_array_size (stmtblock_t *block, tree desc, gfc_expr *expr, tree dim) enum gfc_array_kind akind = GFC_TYPE_ARRAY_AKIND (TREE_TYPE (desc)); if (expr == NULL || expr->rank < 0) rank = fold_convert (signed_char_type_node, - gfc_conv_descriptor_rank (desc)); + gfc_conv_descriptor_rank_get (desc)); else rank = build_int_cst (signed_char_type_node, expr->rank); @@ -8672,8 +8670,7 @@ gfc_conv_array_parameter (gfc_se *se, gfc_expr *expr, bool g77, gfc_conv_descriptor_stride_get (se->expr, gfc_index_zero_node)); tree tmp2 = gfc_conv_descriptor_dtype_get (se->expr); gfc_conv_descriptor_dtype_set (&block, arr, tmp2); - gfc_add_modify (&block, gfc_conv_descriptor_rank (arr), - build_int_cst (signed_char_type_node, 1)); + gfc_conv_descriptor_rank_set (&block, arr, 1); gfc_conv_descriptor_span_set (&block, arr, gfc_conv_descriptor_span_get (arr)); gfc_conv_descriptor_offset_set (&block, arr, gfc_index_zero_node); @@ -8957,7 +8954,7 @@ gfc_full_array_size (stmtblock_t *block, tree decl, int rank) tree nelems; tree tmp; if (rank < 0) - idx = gfc_conv_descriptor_rank (decl); + idx = gfc_conv_descriptor_rank_get (decl); else idx = gfc_rank_cst[rank - 1]; nelems = gfc_conv_descriptor_ubound_get (decl, idx); @@ -9167,8 +9164,7 @@ duplicate_allocatable_coarray (tree dest, tree dest_tok, tree src, tree type, else { /* Set the rank or unitialized memory access may be reported. */ - tmp = gfc_conv_descriptor_rank (dest); - gfc_add_modify (&globalblock, tmp, build_int_cst (TREE_TYPE (tmp), rank)); + gfc_conv_descriptor_rank_set (&globalblock, dest, rank); if (rank) nelems = gfc_full_array_size (&globalblock, src, rank); diff --git a/gcc/fortran/trans-decl.cc b/gcc/fortran/trans-decl.cc index c89047acdcc8..fda3f34682ec 100644 --- a/gcc/fortran/trans-decl.cc +++ b/gcc/fortran/trans-decl.cc @@ -7361,7 +7361,7 @@ gfc_conv_cfi_to_gfc (stmtblock_t *init, stmtblock_t *finally, { /* Set gfc->dtype.rank, if assumed-rank. */ rank = gfc_get_cfi_desc_rank (cfi); - gfc_add_modify (&block, gfc_conv_descriptor_rank (gfc_desc), rank); + gfc_conv_descriptor_rank_set (&block, gfc_desc, rank); } else if (!GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (gfc_desc))) /* In that case, the CFI rank and the declared rank can differ. */ diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc index f488e87663e9..77ef2e16e13b 100644 --- a/gcc/fortran/trans-descriptor.cc +++ b/gcc/fortran/trans-descriptor.cc @@ -283,8 +283,8 @@ gfc_conv_descriptor_span_set (stmtblock_t *block, tree desc, } -tree -gfc_conv_descriptor_rank (tree desc) +static tree +get_descriptor_rank (tree desc) { tree tmp; tree dtype; @@ -297,6 +297,24 @@ gfc_conv_descriptor_rank (tree desc) dtype, tmp, NULL_TREE); } +tree +gfc_conv_descriptor_rank_get (tree desc) +{ + return non_lvalue_loc (input_location, get_descriptor_rank (desc)); +} + +void +gfc_conv_descriptor_rank_set (stmtblock_t *block, tree desc, tree value) +{ + tree t = get_descriptor_rank (desc); + gfc_add_modify (block, t, fold_convert (TREE_TYPE (t), value)); +} + +void +gfc_conv_descriptor_rank_set (stmtblock_t *block, tree desc, int value) +{ + gfc_conv_descriptor_rank_set (block, desc, gfc_rank_cst[value]); +} static tree get_descriptor_version (tree desc) diff --git a/gcc/fortran/trans-descriptor.h b/gcc/fortran/trans-descriptor.h index 3f4fd92df117..54420824c8eb 100644 --- a/gcc/fortran/trans-descriptor.h +++ b/gcc/fortran/trans-descriptor.h @@ -29,7 +29,6 @@ tree gfc_get_cfi_dim_extent (tree desc, tree idx); tree gfc_get_cfi_dim_sm (tree desc, tree idx); -tree gfc_conv_descriptor_rank (tree desc); tree gfc_conv_descriptor_attribute (tree desc); tree gfc_conv_descriptor_type (tree desc); tree gfc_get_descriptor_dimension (tree desc); @@ -41,6 +40,7 @@ tree gfc_conv_descriptor_offset_get (tree desc); tree gfc_conv_descriptor_dtype_get (tree desc); tree gfc_conv_descriptor_elem_len_get (tree desc); tree gfc_conv_descriptor_version_get (tree desc); +tree gfc_conv_descriptor_rank_get (tree desc); tree gfc_conv_descriptor_span_get (tree desc); tree gfc_conv_descriptor_stride_get (tree desc, tree dim); @@ -53,6 +53,8 @@ void gfc_conv_descriptor_offset_set (stmtblock_t *block, tree desc, tree value); void gfc_conv_descriptor_dtype_set (stmtblock_t *block, tree desc, tree value); void gfc_conv_descriptor_elem_len_set (stmtblock_t *block, tree desc, tree value); 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_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); diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc index 52587ecb8bad..bbc9a2cd315d 100644 --- a/gcc/fortran/trans-expr.cc +++ b/gcc/fortran/trans-expr.cc @@ -3308,7 +3308,7 @@ gfc_conv_variable (gfc_se * se, gfc_expr * expr) char *msg; dim = fold_convert (signed_char_type_node, - gfc_conv_descriptor_rank (se->expr)); + gfc_conv_descriptor_rank_get (se->expr)); dim = fold_build2_loc (input_location, MINUS_EXPR, signed_char_type_node, dim, build_int_cst (signed_char_type_node, 1)); lower = gfc_conv_descriptor_lbound_get (se->expr, dim); @@ -6083,7 +6083,8 @@ gfc_conv_gfc_desc_to_cfi_desc (gfc_se *parmse, gfc_expr *e, gfc_symbol *fsym) gfc_add_modify (&block, tmp, build_int_cst (TREE_TYPE (tmp), CFI_VERSION)); if (e->rank < 0) - rank = fold_convert (signed_char_type_node, gfc_conv_descriptor_rank (gfc)); + rank = fold_convert (signed_char_type_node, + gfc_conv_descriptor_rank_get (gfc)); else rank = build_int_cst (signed_char_type_node, e->rank); tmp = gfc_get_cfi_desc_rank (cfi); @@ -6627,12 +6628,9 @@ conv_null_actual (gfc_se * parmse, gfc_expr * e, gfc_symbol * fsym) correct rank. */ if (fsym->as && fsym->as->type == AS_ASSUMED_RANK) { - tree rank; tree tmp = parmse->expr; tmp = gfc_conv_scalar_to_descriptor (parmse, tmp, fsym->attr); - rank = gfc_conv_descriptor_rank (tmp); - gfc_add_modify (&parmse->pre, rank, - build_int_cst (TREE_TYPE (rank), e->rank)); + gfc_conv_descriptor_rank_set (&parmse->pre, tmp, e->rank); parmse->expr = gfc_build_addr_expr (NULL_TREE, tmp); } else @@ -6682,13 +6680,10 @@ conv_null_actual (gfc_se * parmse, gfc_expr * e, gfc_symbol * fsym) For an assumed-rank dummy we provide a descriptor that passes the correct rank. */ { - tree rank; tree tmp = parmse->expr; tmp = gfc_conv_scalar_to_descriptor (parmse, tmp, gfc_expr_attr (e)); - rank = gfc_conv_descriptor_rank (tmp); - gfc_add_modify (&parmse->pre, rank, - build_int_cst (TREE_TYPE (rank), e->rank)); + gfc_conv_descriptor_rank_set (&parmse->pre, tmp, e->rank); gfc_conv_descriptor_data_set (&parmse->pre, tmp, null_pointer_node); parmse->expr = gfc_build_addr_expr (NULL_TREE, tmp); } @@ -6705,11 +6700,7 @@ conv_null_actual (gfc_se * parmse, gfc_expr * e, gfc_symbol * fsym) tmp = gfc_conv_scalar_to_descriptor (parmse, tmp, fsym->attr); dummy_rank = fsym->as ? fsym->as->rank : 0; if (dummy_rank > 0) - { - tree rank = gfc_conv_descriptor_rank (tmp); - gfc_add_modify (&parmse->pre, rank, - build_int_cst (TREE_TYPE (rank), dummy_rank)); - } + gfc_conv_descriptor_rank_set (&parmse->pre, tmp, dummy_rank); gfc_conv_descriptor_data_set (&parmse->pre, tmp, null_pointer_node); parmse->expr = gfc_build_addr_expr (NULL_TREE, tmp); } @@ -10175,8 +10166,7 @@ gfc_trans_structure_assign (tree dest, gfc_expr * expr, bool init, bool coarray) rank = 1; size = build_zero_cst (size_type_node); desc = field; - gfc_add_modify (&block, gfc_conv_descriptor_rank (desc), - build_int_cst (signed_char_type_node, rank)); + gfc_conv_descriptor_rank_set (&block, desc, rank); } else { diff --git a/gcc/fortran/trans-intrinsic.cc b/gcc/fortran/trans-intrinsic.cc index 0030344a7161..f2e57c5ddece 100644 --- a/gcc/fortran/trans-intrinsic.cc +++ b/gcc/fortran/trans-intrinsic.cc @@ -2290,7 +2290,7 @@ gfc_conv_intrinsic_rank (gfc_se *se, gfc_expr *expr) gfc_add_block_to_block (&se->pre, &argse.pre); gfc_add_block_to_block (&se->post, &argse.post); - se->expr = gfc_conv_descriptor_rank (argse.expr); + se->expr = gfc_conv_descriptor_rank_get (argse.expr); se->expr = fold_convert (gfc_get_int_type (gfc_default_integer_kind), se->expr); } @@ -2459,7 +2459,7 @@ gfc_conv_intrinsic_bound (gfc_se * se, gfc_expr * expr, enum gfc_isym_id op) cond = fold_build2_loc (input_location, LT_EXPR, logical_type_node, bound, build_int_cst (TREE_TYPE (bound), 0)); if (as && as->type == AS_ASSUMED_RANK) - tmp = gfc_conv_descriptor_rank (desc); + tmp = gfc_conv_descriptor_rank_get (desc); else tmp = gfc_rank_cst[GFC_TYPE_ARRAY_RANK (TREE_TYPE (desc))]; tmp = fold_build2_loc (input_location, GE_EXPR, logical_type_node, @@ -2554,7 +2554,7 @@ gfc_conv_intrinsic_bound (gfc_se * se, gfc_expr * expr, enum gfc_isym_id op) { tree minus_one = build_int_cst (gfc_array_index_type, -1); tree rank = fold_convert (gfc_array_index_type, - gfc_conv_descriptor_rank (desc)); + gfc_conv_descriptor_rank_get (desc)); rank = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type, rank, minus_one); @@ -8232,7 +8232,7 @@ gfc_conv_intrinsic_sizeof (gfc_se *se, gfc_expr *expr) stmtblock_t body; tmp = fold_convert (gfc_array_index_type, - gfc_conv_descriptor_rank (argse.expr)); + gfc_conv_descriptor_rank_get (argse.expr)); loop_var = gfc_create_var (gfc_array_index_type, "i"); gfc_add_modify (&argse.pre, loop_var, gfc_index_zero_node); exit_label = gfc_build_label_decl (NULL_TREE); @@ -9034,7 +9034,7 @@ gfc_conv_associated (gfc_se *se, gfc_expr *expr) gfc_conv_expr_lhs (&arg1se, arg1->expr); if (arg1->expr->rank == -1) { - tmp = gfc_conv_descriptor_rank (arg1se.expr); + tmp = gfc_conv_descriptor_rank_get (arg1se.expr); tmp = fold_build2_loc (input_location, MINUS_EXPR, TREE_TYPE (tmp), tmp, build_int_cst (TREE_TYPE (tmp), 1)); diff --git a/gcc/fortran/trans-openmp.cc b/gcc/fortran/trans-openmp.cc index 5e0732b1035d..d9e47fef9b5d 100644 --- a/gcc/fortran/trans-openmp.cc +++ b/gcc/fortran/trans-openmp.cc @@ -2042,7 +2042,7 @@ gfc_omp_get_array_size (location_t loc, tree desc, gimple_seq *seq) tree end; if (GFC_TYPE_ARRAY_AKIND (TREE_TYPE (desc)) == GFC_ARRAY_ASSUMED_SHAPE_CONT || GFC_TYPE_ARRAY_AKIND (TREE_TYPE (desc)) == GFC_ARRAY_ASSUMED_SHAPE) - end = gfc_conv_descriptor_rank (desc); + end = gfc_conv_descriptor_rank_get (desc); else end = build_int_cst (signed_char_type_node, GFC_TYPE_ARRAY_RANK (TREE_TYPE (desc))); diff --git a/gcc/fortran/trans-stmt.cc b/gcc/fortran/trans-stmt.cc index 79436b4489aa..5817c6ab4fb2 100644 --- a/gcc/fortran/trans-stmt.cc +++ b/gcc/fortran/trans-stmt.cc @@ -3959,7 +3959,7 @@ gfc_trans_select_rank_cases (gfc_code * code) /* Calculate the switch expression. */ gfc_init_se (&se, NULL); gfc_conv_expr_descriptor (&se, code->expr1); - rank = gfc_conv_descriptor_rank (se.expr); + rank = gfc_conv_descriptor_rank_get (se.expr); rank = gfc_evaluate_now (rank, &block); symbol_attribute attr = gfc_expr_attr (code->expr1); if (!attr.pointer && !attr.allocatable)