[PATCH 05/11] fortran: array descriptor: Add accessors for the type field

Tobias Burnus tburnus@baylibre.com
Mon Dec 8 15:57:43 GMT 2025


Mikael Morin wrote:
> Add accessor functions to get or set the value of the type field of array
> descriptors, and remove from the public API the function giving direct acces
> to the field.

This is one is interesting: The setter not only comes as set of
overloaded functions that modify a stmtblock_t block (taking a
tree or an int), but also one variant that returns a TREE,
returning the modification via gfc_finish_block.

* * *

> +static tree
> +get_type_field (tree type, unsigned field_idx)
> +{
> +  tree field = gfc_advance_chain (TYPE_FIELDS (type), field_idx);
> +  gcc_assert (field != NULL_TREE);
> +
> +  return field;
> +}

If you already introduce such a function just to add
the assert (and the TYPE_FIELDS macro), why don't you
remove the assert at:

>   gfc_get_descriptor_field (tree desc, unsigned field_idx)
>   {
>     tree type = TREE_TYPE (desc);
>     gcc_assert (GFC_DESCRIPTOR_TYPE_P (type));
>   
> -  tree field = gfc_advance_chain (TYPE_FIELDS (type), field_idx);
> +  tree field = get_type_field (type, field_idx);
>     gcc_assert (field != NULL_TREE);
and
> +gfc_conv_descriptor_type_set (stmtblock_t *block, tree desc, int value)
> +{
> +  tree type = TREE_TYPE (desc);
> +  gcc_assert (GFC_DESCRIPTOR_TYPE_P (type));
> +
> +  tree dtype = get_type_field (type, DTYPE_FIELD);
> +  gcc_assert (dtype != NULL_TREE);
> +
> +  tree field = get_type_field (TREE_TYPE (dtype), GFC_DTYPE_TYPE);
> +  gcc_assert (field != NULL_TREE);
* * *


>
> gcc/fortran/ChangeLog:
>
> 	* trans-descriptor.cc (get_type_field): New function.
> 	(gfc_get_descriptor_field): Use it.
> 	(gfc_conv_descriptor_type): Make static and rename ...
> 	(conv_descriptor_type): ... to this.
> 	(gfc_conv_descriptor_type_get, gfc_conv_descriptor_type_set): New
> 	functions.
> 	* trans-descriptor.h (gfc_conv_descriptor_type): Remove declaration.
> 	(gfc_conv_descriptor_type_get, gfc_conv_descriptor_type_set): New
> 	declarations.
> 	* trans-expr.cc (gfc_conv_gfc_desc_to_cfi_desc): Use
> 	gfc_conv_descriptor_type_get to get the value of the type field.
> 	* trans-decl.cc (gfc_conv_cfi_to_gfc): Use
> 	gfc_conv_descriptor_type_set to set the value of the type field.
* * *
> +++ b/gcc/fortran/trans-descriptor.cc
> @@ -61,13 +61,28 @@ along with GCC; see the file COPYING3.  If not see
>   #define LBOUND_SUBFIELD 1
>   #define UBOUND_SUBFIELD 2
>   
> +
> +/* Get FIELD_IDX'th field in struct TYPE.  */
> +
> +static tree
> +get_type_field (tree type, unsigned field_idx)
> +{
> +  tree field = gfc_advance_chain (TYPE_FIELDS (type), field_idx);
> +  gcc_assert (field != NULL_TREE);
> +
> +  return field;
> +}
> +
> +
> +/* Get FIELD_IDX'th field in array descriptor DESC.  */
> +
>   static tree
>   gfc_get_descriptor_field (tree desc, unsigned field_idx)
>   {
...
> +  tree field = get_type_field (type, field_idx);
...
>     return fold_build3_loc (input_location, COMPONENT_REF, TREE_TYPE (field),

First, I think a *the* is missing for "Get (the) FIELD_IDX-th field".

But I think the comment does not really make clear the difference: The first
one gets the declaration of the struct field. The second one gets the component
ref to a field. Maybe use for the second one:

"Return component ref to the FIELD_IDX-th field of array descriptor DESC." ?

* * *

> +/* Return some code setting to VALUE the type discriminator of the array
> +   descriptor DESC.  */
...
> +gfc_conv_descriptor_type_set (tree desc, tree value)
...
> +  return gfc_finish_block (&block);
> +}

"Return some code" sounds odd. How about: "Return modify expr ..."?Or less explicit: "Return code block ...".

(gfc_finish_block = "return block->head", if not empty and not has_scope,
if pre/post had to do something, it uses append_to_statement_list to create
a sequence.)

* * *

Otherwise, LGTM.

Tobias



More information about the Fortran mailing list