https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96013

--- Comment #5 from kargl at gcc dot gnu.org ---
(In reply to kargl from comment #4)
> (In reply to kargl from comment #3)
> > The code is invalid.  Patch against svn revision 280156.
> > 
> > Index: gcc/fortran/module.c
> > ===================================================================
> > --- gcc/fortran/module.c    (revision 280157)
> > +++ gcc/fortran/module.c    (working copy)
> > @@ -5738,7 +5738,11 @@ write_symbol (int n, gfc_symbol *sym)
> >    const char *label;
> >  
> >    if (sym->attr.flavor == FL_UNKNOWN || sym->attr.flavor == FL_LABEL)
> > -    gfc_internal_error ("write_symbol(): bad module symbol %qs", 
> > sym->name);
> > +    {
> > +      gfc_error ("Invalid symbol %qs at %L", sym->name,
> > +            &sym->declared_at);
> > +      return;
> > +    }
> >  
> >    mio_integer (&n);
> 
> The patch is wrong and Gerhard is sort of correct.  z1.f90 is
> invalid as the result variable is never set.  But, an internal
> error should not be signaled.  Fortran 2018 has
> 
>   19.5.1.4 Host association
> 
>   A name that appears in the scoping unit as
>   ...
>     (12) a result-name in a function-stmt or in an entry-stmt,
>   ...
>   is a local identifier in the scoping unit and any entity of the host
>   that has this as its nongeneric name is inaccessible by that name by
>   host association.
> 
> So, the type 't' is inaccessible in the local scope of f().  The code
> is a good example for the requirement of 'implicit none'.

Note, if 't' is actually set to a value, then the code compiles

module m
   type t
   end type
contains
   function f() result(t)
      character(3) :: c
      c = 'abc'
      t = 1
   end
end

Reply via email to