https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84382
--- Comment #6 from Steve Kargl <sgk at troutmask dot apl.washington.edu> --- On Fri, Apr 05, 2019 at 11:15:30PM +0000, sgk at troutmask dot apl.washington.edu wrote: > > We could add > > #define GFC_STD_OPT_GNU03 (GFC_STD_OPT_F03 | GFC_STD_GNU) > #define GFC_STD_OPT_GNU08 (GFC_STD_OPT_F08 | GFC_STD_GNU) > #define GFC_STD_OPT_GNU18 (GFC_STD_OPT_F18 | GFC_STD_GNU) > Against my better judgment. %cat a.f90 program foo integer :: i = z'1234' ! Nonstandard initialization print *, i end program foo % gfcx -o z a.f90 && ./z 4660 % gfcx -o z -std=f2003 a.f90 && ./z a.f90:2:17: 2 | integer :: i = z'1234' ! Nonstandard initialization | 1 Error: GNU Extension: BOZ literal at (1) outside a DATA statement and outside INT/REAL/DBLE/CMPLX % gfcx -o z -std=gnu2003 a.f90 && ./z 4660 Index: gcc/fortran/libgfortran.h =================================================================== --- gcc/fortran/libgfortran.h (revision 270181) +++ gcc/fortran/libgfortran.h (working copy) @@ -46,6 +46,10 @@ along with GCC; see the file COPYING3. If not see #define GFC_STD_OPT_F18 ((GFC_STD_OPT_F08 | GFC_STD_F2018) \ & (~GFC_STD_F2018_DEL)) +#define GFC_STD_OPT_GNU03 (GFC_STD_OPT_F03 | GFC_STD_GNU) +#define GFC_STD_OPT_GNU08 (GFC_STD_OPT_F08 | GFC_STD_GNU) +#define GFC_STD_OPT_GNU18 (GFC_STD_OPT_F18 | GFC_STD_GNU) + /* Bitmasks for the various FPE that can be enabled. These need to be straight integers e.g., 8 instead of (1<<3), because they will be included in Fortran source. */ #define GFC_FPE_INVALID 1 Index: gcc/fortran/lang.opt =================================================================== --- gcc/fortran/lang.opt (revision 270181) +++ gcc/fortran/lang.opt (working copy) @@ -826,6 +826,18 @@ std=gnu Fortran Conform to nothing in particular. +std=gnu2003 +Fortran +Conform to the ISO Fortran 2003 standard with GNU Fortran extensions. + +std=gnu2008 +Fortran +Conform to the ISO Fortran 2008 standard with GNU Fortran extensions. + +std=gnu2018 +Fortran +Conform to the ISO Fortran 2018 standard with GNU Fortran extensions. + std=legacy Fortran Accept extensions to support legacy code. Index: gcc/fortran/options.c =================================================================== --- gcc/fortran/options.c (revision 270181) +++ gcc/fortran/options.c (working copy) @@ -778,6 +778,31 @@ gfc_handle_option (size_t scode, const char *arg, HOST set_default_std_flags (); break; + case OPT_std_gnu2003: + gfc_option.allow_std = GFC_STD_OPT_GNU03; + gfc_option.warn_std = GFC_STD_F95_OBS; + gfc_option.max_identifier_length = 63; + warn_ampersand = 1; + warn_tabs = 1; + break; + + case OPT_std_gnu2008: + gfc_option.allow_std = GFC_STD_OPT_GNU08; + gfc_option.warn_std = GFC_STD_F95_OBS | GFC_STD_F2008_OBS; + gfc_option.max_identifier_length = 63; + warn_ampersand = 1; + warn_tabs = 1; + break; + + case OPT_std_gnu2018: + gfc_option.allow_std = GFC_STD_OPT_GNU18; + gfc_option.warn_std = GFC_STD_F95_OBS | GFC_STD_F2008_OBS + | GFC_STD_F2018_OBS; + gfc_option.max_identifier_length = 63; + warn_ampersand = 1; + warn_tabs = 1; + break; + case OPT_std_legacy: set_default_std_flags (); gfc_option.warn_std = 0; Index: gcc/fortran/invoke.texi =================================================================== --- gcc/fortran/invoke.texi (revision 270181) +++ gcc/fortran/invoke.texi (working copy) @@ -492,23 +492,28 @@ representation of the translated Fortran code, produce @item -std=@var{std} @opindex @code{std=}@var{std} option -Specify the standard to which the program is expected to conform, -which may be one of @samp{f95}, @samp{f2003}, @samp{f2008}, -@samp{f2018}, @samp{gnu}, or @samp{legacy}. The default value for -@var{std} is @samp{gnu}, which specifies a superset of the latest -Fortran standard that includes all of the extensions supported by GNU -Fortran, although warnings will be given for obsolete extensions not +Specify the standard to which the program is expected to conform +which may be one of @samp{f95}, @samp{f2003}, @samp{f2008}, @samp{f2018}, +@samp{gnu}, @samp{gnu2003}, @samp{gnu2008}, @samp{gnu2018},or @samp{legacy}. +The default value for @var{std} is @samp{gnu}, which specifies a superset +of the latest Fortran standard that includes all of the extensions supported +by GNU Fortran, although warnings will be given for obsolete extensions not recommended for use in new code. The @samp{legacy} value is equivalent but without the warnings for obsolete extensions, and may -be useful for old non-standard programs. The @samp{f95}, +be useful for old nonstandard programs. The @samp{f95}, @samp{f2003}, @samp{f2008}, and @samp{f2018} values specify strict conformance to the Fortran 95, Fortran 2003, Fortran 2008 and Fortran 2018 standards, respectively; errors are given for all extensions beyond the relevant language standard, and warnings are given for the Fortran 77 features that are permitted but obsolescent in later -standards. The deprecated option @samp{-std=f2008ts} acts as an alias for +standards. The deprecated option @samp{-std=f2008ts} acts as an alias for @samp{-std=f2018}. It is only present for backwards compatibility with earlier gfortran versions and should not be used any more. +The @samp{gnu2003}, @samp{gnu2008}, and @samp{gnu2018} values specify +adherences to the Fortran 2003, Fortran 2008 and Fortran +2018 standards; while allowing GNU Fortran extensions. For example, +@code{std=gnu2003} would reject Fortran 2008 and 2018 feature, but +would allow nonstandard construction such as @code{REAL*4}. @item -ftest-forall-temp @opindex @code{ftest-forall-temp}