[Bug fortran/96486] get_environment_variable fails for zero-length values

sgk at troutmask dot apl.washington.edu gcc-bugzilla@gcc.gnu.org
Thu Aug 6 15:56:56 GMT 2020


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

--- Comment #14 from Steve Kargl <sgk at troutmask dot apl.washington.edu> ---
On Thu, Aug 06, 2020 at 08:03:29AM +0000, markeggleston at gcc dot gnu.org
wrote:
> (In reply to kargl from comment #6)
> > I do note there are other problems with get_environment_variable.
> 
> It looks to me that this intrinsic supports the Fortran 2003
> standard. Changes were introduced with the Fortran 2018 and
> support has not yet been implemented.

Yep

> > 
> > 1) Neither length nor status can be integer(1).  gfortran should issue
> >    an error.
> 
> Fortran 2003 has default kind for these arguments.
> 

As does F2008.

> > 
> > 2) Fortran 2018 has added an optional errmsg argument.  This is not
> >    supported.
> > 
> > 3) gfortran is issuing errors that don't make sence (to me).
> > 
> > program foo
> >    integer( 1) i01
> >    integer( 2) i02
> >    integer( 4) i04
> >    integer( 8) i08
> > #ifdef __GFC_INT_16__
> >    integer(16) i16
> > #endif
> >    character(len=20) name
> > 
> >    print '(A,I0)', 'range(i01) = ', range(i01)
> >    print '(A,I0)', 'range(i02) = ', range(i02)
> >    print '(A,I0)', 'range(i04) = ', range(i04)
> >    print '(A,I0)', 'range(i08) = ', range(i08)
> > #ifdef __GFC_INT_16__
> >    print '(A,I0)', 'range(i16) = ', range(i16)
> > #endif
> > 
> >    name = ''
> >    ! Although valid Fortran, this should probably raise a warning.
> >    call get_environment_variable(name);
> > 
> >    name = 'FOO'
> >    call get_environment_variable(name,length=i01);  ! Should be an error
> >    call get_environment_variable(name,length=i02);  ! Should be ok
> >    call get_environment_variable(name,length=i04);  ! Should be ok
> >    call get_environment_variable(name,length=i08);  ! Should be ok
> > #ifdef __GFC_INT_16__
> >    call get_environment_variable(name,length=i16);  ! Should be ok
> > #endif
> > 
> > end program foo
> > 
> > mobile:kargl[256] gfcx -o z a.F90 && ./z
> > a.F90:29:45:
> > 
> >    29 |    call get_environment_variable(name,length=i01);  ! Should be an
> > error
> >       |                                             1
> > Error: In call to 'get_environment_variable' at (1), type mismatch in
> > argument length'; pass 'INTEGER(1)' to 'INTEGER(4)'
> > a.F90:30:45:
> > 
> >    30 |    call get_environment_variable(name,length=i02);
> >       |                                             1
> > Error: In call to 'get_environment_variable' at (1), type mismatch in
> > argument length'; pass 'INTEGER(2)' to 'INTEGER(4)'
> > a.F90:32:45:
> > 
> >    32 |    call get_environment_variable(name,length=i08);
> >       |                                             1
> > Error: In call to 'get_environment_variable' at (1), type mismatch in
> > argument length'; pass 'INTEGER(8)' to 'INTEGER(4)'
> 
> The mismatch errors are consistent with Fortran 2003 support.
> 
> I think these issues should be in a separate PR for Fortran 2018 support.
> 

gfortran is using the default argument checking routine, which
is based on the information from intrinsic.c.  With f2018,
making (almost?) everything generic, a gfc_check_environment_variable
is needed.  This then may allow some of the runtime checking
to be removed.


More information about the Gcc-bugs mailing list