[Patch, fortran] PR104750: Parameterized derived type extension from outside the host module

Mikael Morin morin-mikael@orange.fr
Wed Sep 2 20:46:48 GMT 2026


Le 02/09/2026 à 18:40, Paul Richard Thomas a écrit :
> Hello Mikael,
> 
> Please find the patch attached, which BTW is what I normally do :-)
> 
> Cheers
> 
> Paul
> 
Thanks.  See below.

> diff --git a/gcc/fortran/module.cc b/gcc/fortran/module.cc
> index b79db02a30c..f0101de049e 100644
> --- a/gcc/fortran/module.cc
> +++ b/gcc/fortran/module.cc
> @@ -5746,6 +5745,58 @@ read_cleanup (pointer_info *p)
>  }
>  
>  
> +/* Reconstruct PDT parameter namespaces after all needed module symbols have
> +   been loaded.  read_cleanup installs named symtrees for the type-parameter
> +   symbols first.  */
> +
> +static void
> +fixup_pdt_parameter_namespaces (pointer_info *p)
> +{
> +  gfc_symbol *sym;
> +  gfc_formal_arglist *f, *fp;
> +  gfc_namespace *ns;
> +  gfc_symbol *super;
> +
> +  if (p == NULL)
> +    return;
> +
> +  fixup_pdt_parameter_namespaces (p->left);
> +  fixup_pdt_parameter_namespaces (p->right);
> +
> +  if (p->type != P_SYMBOL || p->u.rsym.state != USED)
> +    return;
> +
> +  sym = p->u.rsym.sym;
> +  if (sym == NULL
> +      || !sym->attr.pdt_template
> +      || sym->f2k_derived == NULL
> +      || sym->f2k_derived->sym_root != NULL)
> +    return;
> +
> +/* Transfer the sym_root of the namespace containing locally-declared PDT
> +   type-parameter symbols to that the derived type's namespace.  */
> +  if (sym == NULL || !sym->attr.pdt_template || sym->f2k_derived == NULL
> +      || sym->f2k_derived->sym_root != NULL)
> +    return;
This condition is redundant with the previous one.
OK with that fixed.

One more comment...

> +
> +  f = sym->formal;
> +  super = gfc_get_derived_super_type (sym);
> +  if (super && super->attr.pdt_template)
> +    for (fp = super->formal; fp && f; fp = fp->next)
> +      f = f->next;
> +
> +  if (f == NULL || f->sym == NULL || f->sym->ns == NULL
> +      || f->sym->ns->sym_root == NULL)
> +    return;
> +
> +  ns = f->sym->ns;
> +  sym->f2k_derived->sym_root = ns->sym_root;
> +  ns->sym_root = NULL;

> +  ns->refs++;
> +  gfc_free_namespace (ns);
... this two lines sequence moved from mio_f2k_derived is probably 
useless, unless ns->refs is zero before it, which is probably not the 
case, as gfc_get_namespace immediately sets it to one.
> +}
> +
> +
>  /* It is not quite enough to check for ambiguity in the symbols by
>     the loaded symbol and the new symbol not being identical.  */
>  static bool


More information about the Fortran mailing list