https://gcc.gnu.org/g:f83c3129c1fa313c795c6658f9ebe58596c7a750
commit f83c3129c1fa313c795c6658f9ebe58596c7a750 Author: Mikael Morin <mik...@gcc.gnu.org> Date: Thu Aug 7 11:42:13 2025 +0200 Refactoring gfc_nullify_descriptor/gfc_init_descriptor_variable Diff: --- gcc/fortran/trans-descriptor.cc | 14 +++++++++++--- gcc/fortran/trans-expr.cc | 11 +++++++++-- gcc/fortran/trans-types.cc | 9 +++++++-- gcc/fortran/trans-types.h | 1 + gcc/fortran/trans.h | 1 + 5 files changed, 29 insertions(+), 7 deletions(-) diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc index 44b0d735f004..44cc2906c128 100644 --- a/gcc/fortran/trans-descriptor.cc +++ b/gcc/fortran/trans-descriptor.cc @@ -661,7 +661,8 @@ gfc_nullify_descriptor (stmtblock_t *block, tree descr) void -gfc_init_descriptor_variable (stmtblock_t *block, gfc_symbol *sym, gfc_expr *expr, tree descr) +gfc_nullify_descriptor (stmtblock_t *block, gfc_symbol *sym, gfc_expr *expr, + tree descr, tree string_length) { symbol_attribute attr = gfc_symbol_attr (sym); @@ -695,8 +696,15 @@ gfc_init_descriptor_variable (stmtblock_t *block, gfc_symbol *sym, gfc_expr *exp rank = -1; etype = gfc_get_element_type (TREE_TYPE (descr)); - gfc_conv_descriptor_dtype_set (block, descr, - gfc_get_dtype_rank_type (rank, etype)); + tree dtype = gfc_get_dtype_rank_type_slen (rank, etype, string_length); + gfc_conv_descriptor_dtype_set (block, descr, dtype); +} + +void +gfc_init_descriptor_variable (stmtblock_t *block, gfc_symbol *sym, + gfc_expr *expr, tree descr) +{ + return gfc_nullify_descriptor (block, sym, expr, descr, NULL_TREE); } diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc index 0ec661de4e31..b5143e535dfd 100644 --- a/gcc/fortran/trans-expr.cc +++ b/gcc/fortran/trans-expr.cc @@ -66,7 +66,7 @@ gfc_get_character_len (tree type) /* Calculate the number of bytes in a string. */ tree -gfc_get_character_len_in_bytes (tree type) +gfc_get_character_len_in_bytes (tree type, tree slen) { tree tmp, len; @@ -76,7 +76,7 @@ gfc_get_character_len_in_bytes (tree type) tmp = TYPE_SIZE_UNIT (TREE_TYPE (type)); tmp = (tmp && !integer_zerop (tmp)) ? (fold_convert (gfc_charlen_type_node, tmp)) : (NULL_TREE); - len = gfc_get_character_len (type); + len = slen ? slen : gfc_get_character_len (type); if (tmp && len && !integer_zerop (len)) len = fold_build2_loc (input_location, MULT_EXPR, gfc_charlen_type_node, len, tmp); @@ -84,6 +84,13 @@ gfc_get_character_len_in_bytes (tree type) } +tree +gfc_get_character_len_in_bytes (tree type) +{ + return gfc_get_character_len_in_bytes (type, NULL_TREE); +} + + /* Convert a scalar to an array descriptor. To be used for assumed-rank arrays. */ diff --git a/gcc/fortran/trans-types.cc b/gcc/fortran/trans-types.cc index 1754d9821532..e324fb9c41ea 100644 --- a/gcc/fortran/trans-types.cc +++ b/gcc/fortran/trans-types.cc @@ -1695,7 +1695,7 @@ gfc_get_desc_dim_type (void) unknown cases abort. */ tree -gfc_get_dtype_rank_type (int rank, tree etype) +gfc_get_dtype_rank_type_slen (int rank, tree etype, tree length) { tree ptype; tree size; @@ -1764,7 +1764,7 @@ gfc_get_dtype_rank_type (int rank, tree etype) { case BT_CHARACTER: gcc_assert (TREE_CODE (ptype) == ARRAY_TYPE); - size = gfc_get_character_len_in_bytes (ptype); + size = gfc_get_character_len_in_bytes (ptype, length); break; case BT_VOID: gcc_assert (TREE_CODE (ptype) == POINTER_TYPE); @@ -1805,6 +1805,11 @@ gfc_get_dtype_rank_type (int rank, tree etype) return dtype; } +tree +gfc_get_dtype_rank_type (int rank, tree etype) +{ + return gfc_get_dtype_rank_type_slen (rank, etype, NULL_TREE); +} tree gfc_get_dtype (tree type, int * rank) diff --git a/gcc/fortran/trans-types.h b/gcc/fortran/trans-types.h index aba841da9cb5..dc75cd82a841 100644 --- a/gcc/fortran/trans-types.h +++ b/gcc/fortran/trans-types.h @@ -116,6 +116,7 @@ bool gfc_return_by_reference (gfc_symbol *); bool gfc_is_nodesc_array (gfc_symbol *); /* Return the DTYPE for an array. */ +tree gfc_get_dtype_rank_type_slen (int, tree, tree); tree gfc_get_dtype_rank_type (int, tree); tree gfc_get_dtype (tree, int *rank = NULL); diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h index 55541845a6d6..4f43117c8786 100644 --- a/gcc/fortran/trans.h +++ b/gcc/fortran/trans.h @@ -518,6 +518,7 @@ void gfc_conv_expr_type (gfc_se * se, gfc_expr *, tree); /* trans-expr.cc */ tree gfc_get_character_len_in_bytes (tree); +tree gfc_get_character_len_in_bytes (tree, tree); tree gfc_conv_scalar_to_descriptor (gfc_se *, tree, symbol_attribute); tree gfc_get_ultimate_alloc_ptr_comps_caf_token (gfc_se *, gfc_expr *); tree gfc_string_to_single_character (tree len, tree str, int kind);