Index: gcc/fortran/invoke.texi =================================================================== --- gcc/fortran/invoke.texi (revision 253108) +++ gcc/fortran/invoke.texi (working copy) @@ -119,8 +119,8 @@ by type. Explanations are in the following sectio @gccoptlist{-fall-intrinsics -fbackslash -fcray-pointer -fd-lines-as-code @gol -fd-lines-as-comments @gol -fdec -fdec-structure -fdec-intrinsic-ints -fdec-static -fdec-math @gol --fdefault-double-8 -fdefault-integer-8 @gol --fdefault-real-8 -fdollar-ok -ffixed-line-length-@var{n} @gol +-fdefault-double-8 -fdefault-integer-8 -fdefault-real-8 @gol +-fdefault-real-10 -fdefault-real-16 -fdollar-ok -ffixed-line-length-@var{n} @gol -ffixed-line-length-none -ffree-form -ffree-line-length-@var{n} @gol -ffree-line-length-none -fimplicit-none -finteger-4-integer-8 @gol -fmax-identifier-length -fmodule-private -ffixed-form -fno-range-check @gol @@ -404,6 +404,22 @@ the default width of @code{DOUBLE PRECISION} to 16 @code{-fdefault-double-8} is given, too. Unlike @option{-freal-4-real-8}, it does not promote variables with explicit kind declaration. +@item -fdefault-real-10 +@opindex @code{fdefault-real-10} +Set the default real type to a 10 byte wide type. This option also affects +the kind of non-double real constants like @code{1.0}, and does promote +the default width of @code{DOUBLE PRECISION} to 16 bytes if possible, unless +@code{-fdefault-double-8} is given. Unlike @option{-freal-4-real-10}, +it does not promote variables with explicit kind declaration. + +@item -fdefault-real-16 +@opindex @code{fdefault-real-16} +Set the default real type to a 16 byte wide type. This option also affects +the kind of non-double real constants like @code{1.0}, and does promote +the default width of @code{DOUBLE PRECISION} to 16 bytes if possible, unless +@code{-fdefault-double-8} is given. Unlike @option{-freal-4-real-16}, +it does not promote variables with explicit kind declaration. + @item -fdefault-double-8 @opindex @code{fdefault-double-8} Set the @code{DOUBLE PRECISION} type to an 8 byte wide type. Do nothing if this Index: gcc/fortran/lang.opt =================================================================== --- gcc/fortran/lang.opt (revision 253108) +++ gcc/fortran/lang.opt (working copy) @@ -457,9 +457,17 @@ Fortran Var(flag_default_integer) Set the default integer kind to an 8 byte wide type. fdefault-real-8 -Fortran Var(flag_default_real) +Fortran Var(flag_default_real_8) Set the default real kind to an 8 byte wide type. +fdefault-real-10 +Fortran Var(flag_default_real_10) +Set the default real kind to an 10 byte wide type. + +fdefault-real-16 +Fortran Var(flag_default_real_16) +Set the default real kind to an 16 byte wide type. + fdollar-ok Fortran Var(flag_dollar_ok) Allow dollar signs in entity names. Index: gcc/fortran/module.c =================================================================== --- gcc/fortran/module.c (revision 253108) +++ gcc/fortran/module.c (working copy) @@ -6741,7 +6741,7 @@ use_iso_fortran_env_module (void) "standard", symbol[i].name, &u->where)) continue; - if ((flag_default_integer || flag_default_real) + if ((flag_default_integer || flag_default_real_8) && symbol[i].id == ISOFORTRANENV_NUMERIC_STORAGE_SIZE) gfc_warning_now (0, "Use of the NUMERIC_STORAGE_SIZE named " "constant from intrinsic module " @@ -6808,7 +6808,7 @@ use_iso_fortran_env_module (void) if ((gfc_option.allow_std & symbol[i].standard) == 0) continue; - if ((flag_default_integer || flag_default_real) + if ((flag_default_integer || flag_default_real_8) && symbol[i].id == ISOFORTRANENV_NUMERIC_STORAGE_SIZE) gfc_warning_now (0, "Use of the NUMERIC_STORAGE_SIZE named constant " Index: gcc/fortran/trans-types.c =================================================================== --- gcc/fortran/trans-types.c (revision 253108) +++ gcc/fortran/trans-types.c (working copy) @@ -530,7 +530,7 @@ gfc_init_kinds (void) } /* Choose the default real kind. Again, we choose 4 when possible. */ - if (flag_default_real) + if (flag_default_real_8) { if (!saw_r8) gfc_fatal_error ("REAL(KIND=8) is not available for " @@ -538,6 +538,22 @@ gfc_init_kinds (void) gfc_default_real_kind = 8; } + else if (flag_default_real_10) + { + if (!saw_r10) + gfc_fatal_error ("REAL(KIND=10) is not available for " + "%<-fdefault-real-10%> option"); + + gfc_default_real_kind = 10; + } + else if (flag_default_real_16) + { + if (!saw_r16) + gfc_fatal_error ("REAL(KIND=16) is not available for " + "%<-fdefault-real-16%> option"); + + gfc_default_real_kind = 16; + } else if (flag_real4_kind == 8) { if (!saw_r8) @@ -571,14 +587,20 @@ gfc_init_kinds (void) are specified, we use kind=8, if it's available. If -fdefault-real is specified without -fdefault-double, we use kind=16, if it's available. Otherwise we do not change anything. */ - if (flag_default_double && !flag_default_real) - gfc_fatal_error ("Use of %<-fdefault-double-8%> requires " - "%<-fdefault-real-8%>"); - - if (flag_default_real && flag_default_double && saw_r8) + if (flag_default_double && saw_r8) gfc_default_double_kind = 8; - else if (flag_default_real && saw_r16) - gfc_default_double_kind = 16; + else if (flag_default_real_8 || flag_default_real_10 || flag_default_real_16) + { + /* Use largest available kind. */ + if (saw_r16) + gfc_default_double_kind = 16; + else if (saw_r10) + gfc_default_double_kind = 10; + else if (saw_r8) + gfc_default_double_kind = 8; + else + gfc_default_double_kind = gfc_default_real_kind; + } else if (flag_real8_kind == 4) { if (!saw_r4) Index: gcc/testsuite/gfortran.dg/promotion_3.f90 =================================================================== --- gcc/testsuite/gfortran.dg/promotion_3.f90 (nonexistent) +++ gcc/testsuite/gfortran.dg/promotion_3.f90 (working copy) @@ -0,0 +1,16 @@ +! { dg-do run } +! { dg-options "-fdefault-real-16" } +! +! PR 82143: add a -fdefault-real-16 flag +! +! Contributed by Janus Weil + +real :: r +real(kind=4) :: r4 +real(kind=8) :: r8 +double precision :: d +if (kind(r4) /= 4) call abort +if (kind(r8) /= 8) call abort +if (kind(r) /= 16) call abort +if (kind(d) /= 16) call abort +end Index: gcc/testsuite/gfortran.dg/promotion_4.f90 =================================================================== --- gcc/testsuite/gfortran.dg/promotion_4.f90 (nonexistent) +++ gcc/testsuite/gfortran.dg/promotion_4.f90 (working copy) @@ -0,0 +1,16 @@ +! { dg-do run } +! { dg-options "-fdefault-real-10" } +! +! PR 82143: add a -fdefault-real-16 flag +! +! Contributed by Janus Weil + +real :: r +real(kind=4) :: r4 +real(kind=8) :: r8 +double precision :: d +if (kind(r4) /= 4) call abort +if (kind(r8) /= 8) call abort +if (kind(r) /= 10) call abort +if (kind(d) /= 16) call abort +end