https://gcc.gnu.org/g:5b4115ae6f1d5c99c901903b9bc94a7b62324183
commit 5b4115ae6f1d5c99c901903b9bc94a7b62324183 Author: Mikael Morin <mik...@gcc.gnu.org> Date: Tue Aug 12 18:57:20 2025 +0200 Refactoring gfc_set_descriptor_from_scalar Diff: --- gcc/fortran/trans-descriptor.cc | 60 +++++++++++++++++------------------------ gcc/fortran/trans-descriptor.h | 3 ++- gcc/fortran/trans-expr.cc | 2 +- 3 files changed, 28 insertions(+), 37 deletions(-) diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc index 87ddf839a931..bf2e0fd97a70 100644 --- a/gcc/fortran/trans-descriptor.cc +++ b/gcc/fortran/trans-descriptor.cc @@ -936,56 +936,46 @@ gfc_create_null_actual_descriptor (stmtblock_t *block, gfc_typespec *ts, void -gfc_set_descriptor_from_scalar_class (stmtblock_t *block, tree descr, - tree scalar, gfc_expr *scalar_expr) -{ - tree type = gfc_get_scalar_to_descriptor_type (TREE_TYPE (scalar), - gfc_expr_attr (scalar_expr)); - gfc_conv_descriptor_dtype_set (block, descr, - gfc_get_dtype (type)); - - tree tmp = gfc_class_data_get (scalar); - if (!POINTER_TYPE_P (TREE_TYPE (tmp))) - tmp = gfc_build_addr_expr (NULL_TREE, tmp); - - gfc_conv_descriptor_data_set (block, descr, tmp); -} - - -void -gfc_set_descriptor_from_scalar (stmtblock_t *block, tree descr, - tree scalar, gfc_expr *scalar_expr, - tree cond_presence, tree caf_token) +gfc_set_descriptor_from_scalar (stmtblock_t *block, tree descr, tree scalar, + symbol_attribute attr, + tree cond_presence = NULL_TREE, + tree caf_token = NULL_TREE) { if (flag_coarray == GFC_FCOARRAY_LIB && caf_token) gfc_conv_descriptor_token_set (block, descr, caf_token); - tree type = gfc_get_scalar_to_descriptor_type (TREE_TYPE (scalar), - gfc_expr_attr (scalar_expr)); - gfc_conv_descriptor_dtype_set (block, descr, - gfc_get_dtype (type)); + tree type = gfc_get_scalar_to_descriptor_type (TREE_TYPE (scalar), attr); + if (!POINTER_TYPE_P (TREE_TYPE (scalar))) + scalar = gfc_build_addr_expr (NULL_TREE, scalar); if (cond_presence) scalar = build3_loc (input_location, COND_EXPR, TREE_TYPE (scalar), cond_presence, scalar, fold_convert (TREE_TYPE (scalar), null_pointer_node)); + + gfc_conv_descriptor_dtype_set (block, descr, gfc_get_dtype (type)); gfc_conv_descriptor_data_set (block, descr, scalar); + gfc_conv_descriptor_span_set (block, descr, + gfc_conv_descriptor_elem_len_get (descr)); } void -gfc_set_descriptor_from_scalar (stmtblock_t *block, tree descr, tree scalar) +gfc_set_descriptor_from_scalar_class (stmtblock_t *block, tree descr, + tree scalar, gfc_expr *scalar_expr) { - tree etype = TREE_TYPE (scalar); - if (!POINTER_TYPE_P (TREE_TYPE (scalar))) - scalar = gfc_build_addr_expr (NULL_TREE, scalar); - else if (TREE_TYPE (etype) && TREE_CODE (TREE_TYPE (etype)) == ARRAY_TYPE) - etype = TREE_TYPE (etype); + gfc_set_descriptor_from_scalar (block, descr, gfc_class_data_get (scalar), + gfc_expr_attr (scalar_expr)); +} - gfc_conv_descriptor_dtype_set (block, descr, - gfc_get_dtype_rank_type (0, etype)); - gfc_conv_descriptor_data_set (block, descr, scalar); - gfc_conv_descriptor_span_set (block, descr, - gfc_conv_descriptor_elem_len_get (descr)); + +void +gfc_set_descriptor_from_scalar (stmtblock_t *block, tree descr, + tree scalar, gfc_expr *scalar_expr, + tree cond_presence, tree caf_token) +{ + gfc_set_descriptor_from_scalar (block, descr, scalar, + gfc_expr_attr (scalar_expr), cond_presence, + caf_token); } diff --git a/gcc/fortran/trans-descriptor.h b/gcc/fortran/trans-descriptor.h index 9284320f0ba1..d7d4fe43d4b2 100644 --- a/gcc/fortran/trans-descriptor.h +++ b/gcc/fortran/trans-descriptor.h @@ -101,7 +101,8 @@ tree gfc_create_null_actual_descriptor (stmtblock_t *, gfc_typespec *, void gfc_init_descriptor_variable (stmtblock_t *block, gfc_symbol *sym, tree descr); void gfc_set_descriptor_from_scalar_class (stmtblock_t *, tree, tree, gfc_expr *); -void gfc_set_descriptor_from_scalar (stmtblock_t *, tree, tree); +void gfc_set_descriptor_from_scalar (stmtblock_t *, tree, tree, symbol_attribute, + tree = NULL_TREE, tree = NULL_TREE); void gfc_set_descriptor_from_scalar (stmtblock_t *, tree, tree, gfc_expr *, tree, tree); diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc index 156126e872bf..f7ae04e3600e 100644 --- a/gcc/fortran/trans-expr.cc +++ b/gcc/fortran/trans-expr.cc @@ -108,7 +108,7 @@ gfc_conv_scalar_to_descriptor (gfc_se *se, tree scalar, symbol_attribute attr) scalar = tmp; } - gfc_set_descriptor_from_scalar (&se->pre, desc, scalar); + gfc_set_descriptor_from_scalar (&se->pre, desc, scalar, attr); /* Copy pointer address back - but only if it could have changed and if the actual argument is a pointer and not, e.g., NULL(). */