[gfortran] restrictions on recursive procedures

Paul Thomas paulthomas2@wanadoo.fr
Wed May 10 21:20:00 GMT 2006


François-Xavier,

I missed the fact that this is a patch; it has neither "patch" in the 
title nor a PR.  The only reason that I found it was that I had the PR 
marked to do myself!

I just applied it to my tree and will do the regtesting, whilst in the 
land of Nod.  From a very quick look, it seemed OK.  I would suggest 
revamping it slightly(untested!), as follows:

  if (expr->value.function.esym && 
!expr->value.function.esym->attr.recursive)
    {
      gfc_symbol *esym, *proc;
      esym = expr->value.function.esym;
      proc = gfc_current_ns->proc_name;
      if (esym == proc)
        {
          gfc_error ("Function '%s' at %L cannot call itself, as it is not "
                     "RECURSIVE", name, &expr->where);
          t = FAILURE;
        }

      if (esym->attr.entry
            && esym->ns->entries
            && proc->ns->entries
            && esym->ns->entries->sym == proc->ns->entries->sym)
        {
          gfc_error ("Call to ENTRY '%s' at %L is recursive, but function "
                     "'%s' is not declared as RECURSIVE",
                     esym->name, &expr->where, 
esym->ns->entries->sym->name);
          t = FAILURE;
        }
    }

+ ibid for the subroutines. You need to cycle through the entries in the 
second block do you not?

Anyway, I will review it properly tomorrow and will come back to you then.

Paul



More information about the Fortran mailing list