[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