https://gcc.gnu.org/g:a1a4246b5d98a1ff62dd274adaa7b2f6c19bb54f
commit a1a4246b5d98a1ff62dd274adaa7b2f6c19bb54f Author: Mikael Morin <mik...@gcc.gnu.org> Date: Wed Jun 18 16:44:26 2025 +0200 Suppression namespace gfc_descriptor Diff: --- gcc/fortran/trans-descriptor.cc | 600 +++++++++++++--------------------------- 1 file changed, 198 insertions(+), 402 deletions(-) diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc index 8b9a39b933b3..0f39a6140748 100644 --- a/gcc/fortran/trans-descriptor.cc +++ b/gcc/fortran/trans-descriptor.cc @@ -174,13 +174,7 @@ gfc_get_cfi_dim_sm (tree desc, tree idx) #define UBOUND_SUBFIELD 2 -namespace gfc_descriptor -{ - -namespace -{ - -tree +static tree get_field (tree desc, unsigned field_idx) { tree type = TREE_TYPE (desc); @@ -192,16 +186,7 @@ get_field (tree desc, unsigned field_idx) return field; } -tree -get_dtype_subfield (tree desc, unsigned subfield) -{ - tree dtype = get_field (desc, DTYPE_FIELD); - tree field = gfc_advance_chain (TYPE_FIELDS (TREE_TYPE (dtype)), subfield); - gcc_assert (field != NULL_TREE); - return field; -} - -tree +static tree get_component (tree desc, unsigned field_idx) { tree field = get_field (desc, field_idx); @@ -210,19 +195,23 @@ get_component (tree desc, unsigned field_idx) desc, field, NULL_TREE); } -tree -get_data (tree desc) + +static tree +get_descriptor_data (tree desc) { return get_component (desc, DATA_FIELD); } +/* This provides READ-ONLY access to the data field. The field itself + doesn't have the proper type. */ + tree -conv_data_get (tree desc) +gfc_conv_descriptor_data_get (tree desc) { tree type = TREE_TYPE (desc); gcc_assert (TREE_CODE (type) != REFERENCE_TYPE); - tree field = get_data (desc); + tree field = get_descriptor_data (desc); tree target_type = GFC_TYPE_ARRAY_DATAPTR_TYPE (type); if (gfc_type_contains_placeholder_p (target_type)) target_type = gfc_substitute_placeholder_in_type (target_type, desc, @@ -231,18 +220,27 @@ conv_data_get (tree desc) return non_lvalue_loc (input_location, t); } +/* This provides WRITE access to the data field. + + TUPLES_P is true if we are generating tuples. + + This function gets called through the following macros: + gfc_conv_descriptor_data_set + gfc_conv_descriptor_data_set. */ + void -conv_data_set (stmtblock_t *block, tree desc, tree value) +gfc_conv_descriptor_data_set (stmtblock_t *block, tree desc, tree value) { - tree field = get_data (desc); + tree field = get_descriptor_data (desc); tree type = TREE_TYPE (field); if (gfc_type_contains_placeholder_p (type)) type = gfc_substitute_placeholder_in_type (type, desc, block); gfc_add_modify (block, field, fold_convert (type, value)); } -tree -get_offset (tree desc) + +static tree +get_descriptor_offset (tree desc) { tree field = get_component (desc, OFFSET_FIELD); gcc_assert (TREE_TYPE (field) == gfc_array_index_type); @@ -250,20 +248,21 @@ get_offset (tree desc) } tree -conv_offset_get (tree desc) +gfc_conv_descriptor_offset_get (tree desc) { - return non_lvalue_loc (input_location, get_offset (desc)); + return non_lvalue_loc (input_location, get_descriptor_offset (desc)); } void -conv_offset_set (stmtblock_t *block, tree desc, tree value) +gfc_conv_descriptor_offset_set (stmtblock_t *block, tree desc, tree value) { - tree t = get_offset (desc); + tree t = get_descriptor_offset (desc); gfc_add_modify (block, t, fold_convert (TREE_TYPE (t), value)); } -tree -get_dtype (tree desc) + +static tree +get_descriptor_dtype (tree desc) { tree field = get_component (desc, DTYPE_FIELD); gcc_assert (TREE_TYPE (field) == get_dtype_type_node ()); @@ -271,20 +270,21 @@ get_dtype (tree desc) } tree -conv_dtype_get (tree desc) +gfc_conv_descriptor_dtype_get (tree desc) { - return non_lvalue_loc (input_location, get_dtype (desc)); + return non_lvalue_loc (input_location, get_descriptor_dtype (desc)); } void -conv_dtype_set (stmtblock_t *block, tree desc, tree val) +gfc_conv_descriptor_dtype_set (stmtblock_t *block, tree desc, tree val) { - tree t = get_dtype (desc); + tree t = get_descriptor_dtype (desc); gfc_add_modify (block, t, val); } -tree -get_span (tree desc) + +static tree +get_descriptor_span (tree desc) { tree field = get_component (desc, SPAN_FIELD); gcc_assert (TREE_TYPE (field) == gfc_array_index_type); @@ -292,25 +292,82 @@ get_span (tree desc) } tree -conv_span_get (tree desc) +gfc_conv_descriptor_span_get (tree desc) { - return non_lvalue_loc (input_location, get_span (desc)); + return non_lvalue_loc (input_location, get_descriptor_span (desc)); } -void -conv_span_set (stmtblock_t *block, tree desc, tree value) +static void +gfc_conv_descriptor_span_set (stmtblock_t *block, tree desc, tree value) { - tree t = get_span (desc); + tree t = get_descriptor_span (desc); gfc_add_modify (block, t, fold_convert (TREE_TYPE (t), value)); } + +static tree +get_descriptor_dimensions (tree desc) +{ + tree field = get_component (desc, DIMENSION_FIELD); + gcc_assert (TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE + && TREE_CODE (TREE_TYPE (TREE_TYPE (field))) == RECORD_TYPE); + return field; +} + +static tree +get_descriptor_dimensions (tree desc, tree type) +{ + tree t = get_descriptor_dimensions (desc); + return build4_loc (input_location, ARRAY_RANGE_REF, type, t, + gfc_index_zero_node, NULL_TREE, NULL_TREE); +} + +static tree +get_descriptor_dimension (tree desc, tree dim) +{ + tree tmp; + + tmp = get_descriptor_dimensions (desc); + + return gfc_build_array_ref (tmp, dim, true); +} + +tree +gfc_conv_descriptor_dimension_get (tree desc, tree dim) +{ + return non_lvalue_loc (input_location, get_descriptor_dimension (desc, dim)); +} + + tree -get_rank (tree desc) +gfc_conv_descriptor_dimensions_get (tree desc) +{ + return non_lvalue_loc (input_location, get_descriptor_dimensions (desc)); +} + +tree +gfc_conv_descriptor_dimensions_get (tree desc, tree type) +{ + tree t = get_descriptor_dimensions (desc, type); + return non_lvalue_loc (input_location, t); +} + +void +gfc_conv_descriptor_dimensions_set (stmtblock_t *block, tree desc, tree value) +{ + location_t loc = input_location; + tree t = get_descriptor_dimensions (desc, TREE_TYPE (value)); + gfc_add_modify_loc (loc, block, t, value); +} + + +static tree +get_descriptor_rank (tree desc) { tree tmp; tree dtype; - dtype = get_dtype (desc); + dtype = get_descriptor_dtype (desc); tmp = gfc_advance_chain (TYPE_FIELDS (TREE_TYPE (dtype)), GFC_DTYPE_RANK); gcc_assert (tmp != NULL_TREE && TREE_TYPE (tmp) == signed_char_type_node); @@ -319,34 +376,36 @@ get_rank (tree desc) } tree -conv_rank_get (tree desc) +gfc_conv_descriptor_rank_get (tree desc) { - return non_lvalue_loc (input_location, get_rank (desc)); + return non_lvalue_loc (input_location, get_descriptor_rank (desc)); } void -conv_rank_set (stmtblock_t *block, tree desc, tree val) +gfc_conv_descriptor_rank_set (stmtblock_t *block, tree desc, tree val) { location_t loc = input_location; - tree t = get_rank (desc); + tree t = get_descriptor_rank (desc); gfc_add_modify_loc (loc, block, t, fold_convert_loc (loc, TREE_TYPE (t), val)); } void -conv_rank_set (stmtblock_t *block, tree desc, int val) +gfc_conv_descriptor_rank_set (stmtblock_t *block, tree desc, int val) { - tree t = get_rank (desc); - conv_rank_set (block, desc, build_int_cst (TREE_TYPE (t), val)); + tree t = get_descriptor_rank (desc); + gfc_conv_descriptor_rank_set (block, desc, build_int_cst (TREE_TYPE (t), + val)); } -tree -get_version (tree desc) + +static tree +get_descriptor_version (tree desc) { tree tmp; tree dtype; - dtype = get_dtype (desc); + dtype = get_descriptor_dtype (desc); tmp = gfc_advance_chain (TYPE_FIELDS (TREE_TYPE (dtype)), GFC_DTYPE_VERSION); gcc_assert (tmp != NULL_TREE && TREE_TYPE (tmp) == integer_type_node); @@ -355,27 +414,28 @@ get_version (tree desc) } tree -conv_version_get (tree desc) +gfc_conv_descriptor_version_get (tree desc) { - return non_lvalue_loc (input_location, get_version (desc)); + return non_lvalue_loc (input_location, get_descriptor_version (desc)); } void -conv_version_set (stmtblock_t *block, tree desc, tree val) +gfc_conv_descriptor_version_set (stmtblock_t *block, tree desc, tree val) { location_t loc = input_location; - tree t = get_version (desc); + tree t = get_descriptor_version (desc); gfc_add_modify_loc (loc, block, t, fold_convert_loc (loc, TREE_TYPE (t), val)); } -tree -get_elem_len (tree desc) + +static tree +get_descriptor_elem_len (tree desc) { tree tmp; tree dtype; - dtype = get_dtype (desc); + dtype = get_descriptor_dtype (desc); tmp = gfc_advance_chain (TYPE_FIELDS (TREE_TYPE (dtype)), GFC_DTYPE_ELEM_LEN); gcc_assert (tmp != NULL_TREE @@ -384,28 +444,31 @@ get_elem_len (tree desc) dtype, tmp, NULL_TREE); } +/* Return the element length from the descriptor dtype field. */ + tree -conv_elem_len_get (tree desc) +gfc_conv_descriptor_elem_len_get (tree desc) { - return non_lvalue_loc (input_location, get_elem_len (desc)); + return non_lvalue_loc (input_location, get_descriptor_elem_len (desc)); } void -conv_elem_len_set (stmtblock_t *block, tree desc, tree value) +gfc_conv_descriptor_elem_len_set (stmtblock_t *block, tree desc, tree value) { location_t loc = input_location; - tree t = get_elem_len (desc); + tree t = get_descriptor_elem_len (desc); gfc_add_modify_loc (loc, block, t, fold_convert_loc (loc, TREE_TYPE (t), value)); } -tree -get_attribute (tree desc) + +static tree +get_descriptor_attribute (tree desc) { tree tmp; tree dtype; - dtype = get_dtype (desc); + dtype = get_descriptor_dtype (desc); tmp = gfc_advance_chain (TYPE_FIELDS (TREE_TYPE (dtype)), GFC_DTYPE_ATTRIBUTE); gcc_assert (tmp!= NULL_TREE @@ -415,27 +478,28 @@ get_attribute (tree desc) } tree -conv_attribute_get (tree desc) +gfc_conv_descriptor_attribute_get (tree desc) { - return non_lvalue_loc (input_location, get_attribute (desc)); + return non_lvalue_loc (input_location, get_descriptor_attribute (desc)); } void -conv_attribute_set (stmtblock_t *block, tree desc, tree value) +gfc_conv_descriptor_attribute_set (stmtblock_t *block, tree desc, tree value) { location_t loc = input_location; - tree t = get_attribute (desc); + tree t = get_descriptor_attribute (desc); gfc_add_modify_loc (loc, block, t, fold_convert_loc (loc, TREE_TYPE (t), value)); } -tree -get_type (tree desc) + +static tree +get_descriptor_type (tree desc) { tree tmp; tree dtype; - dtype = get_dtype (desc); + dtype = get_descriptor_dtype (desc); tmp = gfc_advance_chain (TYPE_FIELDS (TREE_TYPE (dtype)), GFC_DTYPE_TYPE); gcc_assert (tmp!= NULL_TREE && TREE_TYPE (tmp) == signed_char_type_node); @@ -444,85 +508,40 @@ get_type (tree desc) } tree -conv_type_get (tree desc) +gfc_conv_descriptor_type_get (tree desc) { - return non_lvalue_loc (input_location, get_type (desc)); + return non_lvalue_loc (input_location, get_descriptor_type (desc)); } void -conv_type_set (stmtblock_t *block, tree desc, tree value) +gfc_conv_descriptor_type_set (stmtblock_t *block, tree desc, tree value) { location_t loc = input_location; - tree t = get_type (desc); + tree t = get_descriptor_type (desc); gfc_add_modify_loc (loc, block, t, fold_convert_loc (loc, TREE_TYPE (t), value)); } -void -conv_type_set (stmtblock_t *block, tree desc, int value) -{ - tree field = get_dtype_subfield (desc, GFC_DTYPE_TYPE); - tree val = build_int_cst (TREE_TYPE (field), value); - conv_type_set (block, desc, val); -} -tree -get_dimensions (tree desc) +static tree +get_dtype_subfield (tree desc, unsigned subfield) { - tree field = get_component (desc, DIMENSION_FIELD); - gcc_assert (TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE - && TREE_CODE (TREE_TYPE (TREE_TYPE (field))) == RECORD_TYPE); + tree dtype = get_field (desc, DTYPE_FIELD); + tree field = gfc_advance_chain (TYPE_FIELDS (TREE_TYPE (dtype)), subfield); + gcc_assert (field != NULL_TREE); return field; } -tree -get_dimensions (tree desc, tree type) -{ - tree t = get_dimensions (desc); - return build4_loc (input_location, ARRAY_RANGE_REF, type, t, - gfc_index_zero_node, NULL_TREE, NULL_TREE); -} - -tree -conv_dimensions_get (tree desc) -{ - return non_lvalue_loc (input_location, get_dimensions (desc)); -} - -tree -conv_dimensions_get (tree desc, tree type) -{ - tree t = get_dimensions (desc, type); - return non_lvalue_loc (input_location, t); -} - void -conv_dimensions_set (stmtblock_t *block, tree desc, tree value) -{ - location_t loc = input_location; - tree t = get_dimensions (desc, TREE_TYPE (value)); - gfc_add_modify_loc (loc, block, t, value); -} - -tree -get_dimension (tree desc, tree dim) -{ - tree tmp; - - tmp = get_dimensions (desc); - - return gfc_build_array_ref (tmp, dim, true); -} - -tree -conv_dimension_get (tree desc, tree dim) +gfc_conv_descriptor_type_set (stmtblock_t *block, tree desc, int value) { - return non_lvalue_loc (input_location, get_dimension (desc, dim)); + tree field = get_dtype_subfield (desc, GFC_DTYPE_TYPE); + tree val = build_int_cst (TREE_TYPE (field), value); + gfc_conv_descriptor_type_set (block, desc, val); } - tree -get_token (tree desc) +gfc_conv_descriptor_token (tree desc) { gcc_assert (flag_coarray == GFC_FCOARRAY_LIB); tree field = get_component (desc, CAF_TOKEN_FIELD); @@ -533,24 +552,25 @@ get_token (tree desc) } tree -conv_token_get (tree desc) +gfc_conv_descriptor_token_get (tree desc) { - return non_lvalue_loc (input_location, get_token (desc)); + return non_lvalue_loc (input_location, gfc_conv_descriptor_token (desc)); } void -conv_token_set (stmtblock_t *block, tree desc, tree value) +gfc_conv_descriptor_token_set (stmtblock_t *block, tree desc, tree value) { location_t loc = input_location; - tree t = get_token (desc); + tree t = gfc_conv_descriptor_token (desc); gfc_add_modify_loc (loc, block, t, fold_convert_loc (loc, TREE_TYPE (t), value)); } -tree -get_subfield (tree desc, tree dim, unsigned field_idx) + +static tree +get_descr_dim_subfield (tree desc, tree dim, unsigned field_idx) { - tree tmp = get_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); @@ -559,15 +579,15 @@ get_subfield (tree desc, tree dim, unsigned field_idx) } tree -get_spacing (tree desc, tree dim) +get_descriptor_spacing (tree desc, tree dim) { - tree field = get_subfield (desc, dim, SPACING_SUBFIELD); + tree field = get_descr_dim_subfield (desc, dim, SPACING_SUBFIELD); gcc_assert (TREE_TYPE (field) == gfc_array_index_type); return field; } tree -conv_spacing_get (tree desc, tree dim) +gfc_conv_descriptor_spacing_get (tree desc, tree dim) { tree type = TREE_TYPE (desc); gcc_assert (GFC_DESCRIPTOR_TYPE_P (type)); @@ -578,305 +598,67 @@ conv_spacing_get (tree desc, tree dim) || GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ASSUMED_RANK_ALLOCATABLE || GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ASSUMED_RANK_POINTER_CONT || GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_POINTER_CONT)) - return conv_span_get (desc); + return gfc_conv_descriptor_span_get (desc); - return non_lvalue_loc (input_location, get_spacing (desc, dim)); + return non_lvalue_loc (input_location, get_descriptor_spacing (desc, dim)); } void -conv_spacing_set (stmtblock_t *block, tree desc, tree dim, tree value) +gfc_conv_descriptor_spacing_set (stmtblock_t *block, tree desc, + tree dim, tree value) { location_t loc = input_location; - tree t = get_spacing (desc, dim); + tree t = get_descriptor_spacing (desc, dim); gfc_add_modify_loc (loc, block, t, fold_convert_loc (loc, TREE_TYPE (t), value)); } tree -conv_stride_get (tree desc, tree dim) +get_descriptor_lbound (tree desc, tree dim) { - tree type = TREE_TYPE (desc); - gcc_assert (GFC_DESCRIPTOR_TYPE_P (type)); - if (integer_zerop (dim) - && (GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ALLOCATABLE - || GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ASSUMED_SHAPE_CONT - || GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ASSUMED_RANK_CONT - || GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ASSUMED_RANK_ALLOCATABLE - || GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ASSUMED_RANK_POINTER_CONT - || GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_POINTER_CONT)) - return gfc_index_one_node; - - tree spacing = conv_spacing_get (desc, dim); - tree len = conv_elem_len_get (desc); - return fold_build2_loc (input_location, EXACT_DIV_EXPR, gfc_array_index_type, - spacing, len); -} - -tree -get_lbound (tree desc, tree dim) -{ - tree field = get_subfield (desc, dim, LBOUND_SUBFIELD); + tree field = get_descr_dim_subfield (desc, dim, LBOUND_SUBFIELD); gcc_assert (TREE_TYPE (field) == gfc_array_index_type); return field; } tree -conv_lbound_get (tree desc, tree dim) +gfc_conv_descriptor_lbound_get (tree desc, tree dim) { - return non_lvalue_loc (input_location, get_lbound (desc, dim)); + return non_lvalue_loc (input_location, get_descriptor_lbound (desc, dim)); } void -conv_lbound_set (stmtblock_t *block, tree desc, tree dim, tree value) +gfc_conv_descriptor_lbound_set (stmtblock_t *block, tree desc, + tree dim, tree value) { location_t loc = input_location; - tree t = get_lbound (desc, dim); + tree t = get_descriptor_lbound (desc, dim); gfc_add_modify_loc (loc, block, t, fold_convert_loc (loc, TREE_TYPE (t), value)); } tree -get_ubound (tree desc, tree dim) +get_descriptor_ubound (tree desc, tree dim) { - tree field = get_subfield (desc, dim, UBOUND_SUBFIELD); + tree field = get_descr_dim_subfield (desc, dim, UBOUND_SUBFIELD); gcc_assert (TREE_TYPE (field) == gfc_array_index_type); return field; } -tree -conv_ubound_get (tree desc, tree dim) -{ - return non_lvalue_loc (input_location, get_ubound (desc, dim)); -} - -void -conv_ubound_set (stmtblock_t *block, tree desc, tree dim, tree value) -{ - location_t loc = input_location; - tree t = get_ubound (desc, dim); - gfc_add_modify_loc (loc, block, t, - fold_convert_loc (loc, TREE_TYPE (t), value)); -} - -} - -} - - -/* This provides READ-ONLY access to the data field. The field itself - doesn't have the proper type. */ - -tree -gfc_conv_descriptor_data_get (tree desc) -{ - return gfc_descriptor::conv_data_get (desc); -} - -/* This provides WRITE access to the data field. - - TUPLES_P is true if we are generating tuples. - - This function gets called through the following macros: - gfc_conv_descriptor_data_set - gfc_conv_descriptor_data_set. */ - -void -gfc_conv_descriptor_data_set (stmtblock_t *block, tree desc, tree value) -{ - return gfc_descriptor::conv_data_set (block, desc, value); -} - - -tree -gfc_conv_descriptor_offset_get (tree desc) -{ - return gfc_descriptor::conv_offset_get (desc); -} - -void -gfc_conv_descriptor_offset_set (stmtblock_t *block, tree desc, tree value) -{ - return gfc_descriptor::conv_offset_set (block, desc, value); -} - - -tree -gfc_conv_descriptor_dtype_get (tree desc) -{ - return gfc_descriptor::conv_dtype_get (desc); -} - -void -gfc_conv_descriptor_dtype_set (stmtblock_t *block, tree desc, tree val) -{ - gfc_descriptor::conv_dtype_set (block, desc, val); -} - -tree -gfc_conv_descriptor_span_get (tree desc) -{ - return gfc_descriptor::conv_span_get (desc); -} - -static void -gfc_conv_descriptor_span_set (stmtblock_t *block, tree desc, tree value) -{ - return gfc_descriptor::conv_span_set (block, desc, value); -} - -tree -gfc_conv_descriptor_dimension_get (tree desc, tree dim) -{ - return gfc_descriptor::conv_dimension_get (desc, dim); -} - -tree -gfc_conv_descriptor_dimensions_get (tree desc) -{ - return gfc_descriptor::conv_dimensions_get (desc); -} - -tree -gfc_conv_descriptor_dimensions_get (tree desc, tree type) -{ - return gfc_descriptor::conv_dimensions_get (desc, type); -} - -void -gfc_conv_descriptor_dimensions_set (stmtblock_t *block, tree desc, tree value) -{ - return gfc_descriptor::conv_dimensions_set (block, desc, value); -} - -tree -gfc_conv_descriptor_rank_get (tree desc) -{ - return gfc_descriptor::conv_rank_get (desc); -} - -void -gfc_conv_descriptor_rank_set (stmtblock_t *block, tree desc, tree val) -{ - gfc_descriptor::conv_rank_set (block, desc, val); -} - -void -gfc_conv_descriptor_rank_set (stmtblock_t *block, tree desc, int val) -{ - gfc_descriptor::conv_rank_set (block, desc, val); -} - -tree -gfc_conv_descriptor_version_get (tree desc) -{ - return gfc_descriptor::conv_version_get (desc); -} - -void -gfc_conv_descriptor_version_set (stmtblock_t *block, tree desc, tree val) -{ - gfc_descriptor::conv_version_set (block, desc, val); -} - -/* Return the element length from the descriptor dtype field. */ - -tree -gfc_conv_descriptor_elem_len_get (tree desc) -{ - return gfc_descriptor::conv_elem_len_get (desc); -} - -void -gfc_conv_descriptor_elem_len_set (stmtblock_t *block, tree desc, tree value) -{ - gfc_descriptor::conv_elem_len_set (block, desc, value); -} - -tree -gfc_conv_descriptor_attribute_get (tree desc) -{ - return gfc_descriptor::conv_attribute_get (desc); -} - -void -gfc_conv_descriptor_attribute_set (stmtblock_t *block, tree desc, tree value) -{ - gfc_descriptor::conv_attribute_set (block, desc, value); -} - -tree -gfc_conv_descriptor_type_get (tree desc) -{ - return gfc_descriptor::conv_type_get (desc); -} - -void -gfc_conv_descriptor_type_set (stmtblock_t *block, tree desc, tree value) -{ - gfc_descriptor::conv_type_set (block, desc, value); -} - -void -gfc_conv_descriptor_type_set (stmtblock_t *block, tree desc, int value) -{ - gfc_descriptor::conv_type_set (block, desc, value); -} - -tree -gfc_conv_descriptor_token (tree desc) -{ - return gfc_descriptor::get_token (desc); -} - -tree -gfc_conv_descriptor_token_get (tree desc) -{ - return gfc_descriptor::conv_token_get (desc); -} - -void -gfc_conv_descriptor_token_set (stmtblock_t *block, tree desc, tree value) -{ - return gfc_descriptor::conv_token_set (block, desc, value); -} - -tree -gfc_conv_descriptor_spacing_get (tree desc, tree dim) -{ - return gfc_descriptor::conv_spacing_get (desc, dim); -} - -void -gfc_conv_descriptor_spacing_set (stmtblock_t *block, tree desc, - tree dim, tree value) -{ - gfc_descriptor::conv_spacing_set (block, desc, dim, value); -} - -tree -gfc_conv_descriptor_lbound_get (tree desc, tree dim) -{ - return gfc_descriptor::conv_lbound_get (desc, dim); -} - -void -gfc_conv_descriptor_lbound_set (stmtblock_t *block, tree desc, - tree dim, tree value) -{ - return gfc_descriptor::conv_lbound_set (block, desc, dim, value); -} - tree gfc_conv_descriptor_ubound_get (tree desc, tree dim) { - return gfc_descriptor::conv_ubound_get (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) { - return gfc_descriptor::conv_ubound_set (block, desc, dim, value); + location_t loc = input_location; + tree t = get_descriptor_ubound (desc, dim); + gfc_add_modify_loc (loc, block, t, + fold_convert_loc (loc, TREE_TYPE (t), value)); } @@ -928,7 +710,21 @@ gfc_conv_descriptor_extent_get (tree desc, tree dim) tree gfc_conv_descriptor_stride_get (tree desc, tree dim) { - return gfc_descriptor::conv_stride_get (desc, dim); + tree type = TREE_TYPE (desc); + gcc_assert (GFC_DESCRIPTOR_TYPE_P (type)); + if (integer_zerop (dim) + && (GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ALLOCATABLE + || GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ASSUMED_SHAPE_CONT + || GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ASSUMED_RANK_CONT + || GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ASSUMED_RANK_ALLOCATABLE + || GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ASSUMED_RANK_POINTER_CONT + || GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_POINTER_CONT)) + return gfc_index_one_node; + + tree spacing = get_descriptor_spacing (desc, dim); + tree len = get_descriptor_elem_len (desc); + return fold_build2_loc (input_location, EXACT_DIV_EXPR, gfc_array_index_type, + spacing, len); }