https://gcc.gnu.org/g:be9181018e6b8c3b751665d4213448cfaecf5d09
commit be9181018e6b8c3b751665d4213448cfaecf5d09 Author: Mikael Morin <mik...@gcc.gnu.org> Date: Thu Jun 19 17:22:05 2025 +0200 Ajout non_lvalue getters. Diff: --- gcc/fortran/trans-descriptor.cc | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc index 30093a74ae58..3d14581e3958 100644 --- a/gcc/fortran/trans-descriptor.cc +++ b/gcc/fortran/trans-descriptor.cc @@ -176,6 +176,13 @@ gfc_get_descriptor_field (tree desc, unsigned field_idx) desc, field, NULL_TREE); } + +static tree +get_descriptor_data (tree desc) +{ + return gfc_get_descriptor_field (desc, DATA_FIELD); +} + /* This provides READ-ONLY access to the data field. The field itself doesn't have the proper type. */ @@ -183,11 +190,12 @@ tree gfc_conv_descriptor_data_get (tree desc) { tree type = TREE_TYPE (desc); - if (TREE_CODE (type) == REFERENCE_TYPE) - gcc_unreachable (); + gcc_assert (TREE_CODE (type) != REFERENCE_TYPE); - tree field = gfc_get_descriptor_field (desc, DATA_FIELD); - return fold_convert (GFC_TYPE_ARRAY_DATAPTR_TYPE (type), field); + tree field = get_descriptor_data (desc); + tree target_type = GFC_TYPE_ARRAY_DATAPTR_TYPE (TREE_TYPE (desc)); + tree t = fold_convert (target_type, field); + return non_lvalue_loc (input_location, t); } /* This provides WRITE access to the data field. @@ -227,7 +235,7 @@ gfc_conv_descriptor_offset (tree desc) tree gfc_conv_descriptor_offset_get (tree desc) { - return gfc_conv_descriptor_offset (desc); + return non_lvalue_loc (input_location, gfc_conv_descriptor_offset (desc)); } void @@ -258,7 +266,7 @@ gfc_conv_descriptor_span (tree desc) tree gfc_conv_descriptor_span_get (tree desc) { - return gfc_conv_descriptor_span (desc); + return non_lvalue_loc (input_location, gfc_conv_descriptor_span (desc)); } void @@ -391,7 +399,7 @@ gfc_conv_descriptor_subfield (tree desc, tree dim, unsigned field_idx) } static tree -gfc_conv_descriptor_stride (tree desc, tree dim) +get_descriptor_stride (tree desc, tree dim) { tree field = gfc_conv_descriptor_subfield (desc, dim, STRIDE_SUBFIELD); gcc_assert (TREE_TYPE (field) == gfc_array_index_type); @@ -412,19 +420,19 @@ gfc_conv_descriptor_stride_get (tree desc, tree dim) || GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_POINTER_CONT)) return gfc_index_one_node; - return gfc_conv_descriptor_stride (desc, dim); + return non_lvalue_loc (input_location, get_descriptor_stride (desc, dim)); } void gfc_conv_descriptor_stride_set (stmtblock_t *block, tree desc, tree dim, tree value) { - tree t = gfc_conv_descriptor_stride (desc, dim); + tree t = get_descriptor_stride (desc, dim); gfc_add_modify (block, t, fold_convert (TREE_TYPE (t), value)); } static tree -gfc_conv_descriptor_lbound (tree desc, tree dim) +get_descriptor_lbound (tree desc, tree dim) { tree field = gfc_conv_descriptor_subfield (desc, dim, LBOUND_SUBFIELD); gcc_assert (TREE_TYPE (field) == gfc_array_index_type); @@ -434,19 +442,19 @@ gfc_conv_descriptor_lbound (tree desc, tree dim) tree gfc_conv_descriptor_lbound_get (tree desc, tree dim) { - return gfc_conv_descriptor_lbound (desc, dim); + return non_lvalue_loc (input_location, get_descriptor_lbound (desc, dim)); } void gfc_conv_descriptor_lbound_set (stmtblock_t *block, tree desc, tree dim, tree value) { - tree t = gfc_conv_descriptor_lbound (desc, dim); + tree t = get_descriptor_lbound (desc, dim); gfc_add_modify (block, t, fold_convert (TREE_TYPE (t), value)); } static tree -gfc_conv_descriptor_ubound (tree desc, tree dim) +get_descriptor_ubound (tree desc, tree dim) { tree field = gfc_conv_descriptor_subfield (desc, dim, UBOUND_SUBFIELD); gcc_assert (TREE_TYPE (field) == gfc_array_index_type); @@ -456,14 +464,14 @@ gfc_conv_descriptor_ubound (tree desc, tree dim) tree gfc_conv_descriptor_ubound_get (tree desc, tree dim) { - return gfc_conv_descriptor_ubound (desc, dim); + return non_lvalue_loc (input_location, get_descriptor_ubound (desc, dim)); } void gfc_conv_descriptor_ubound_set (stmtblock_t *block, tree desc, tree dim, tree value) { - tree t = gfc_conv_descriptor_ubound (desc, dim); + tree t = get_descriptor_ubound (desc, dim); gfc_add_modify (block, t, fold_convert (TREE_TYPE (t), value)); }