On Mon, Apr 25, 2011 at 11:15:35PM +0300, Janne Blomqvist wrote:
> On Mon, Apr 25, 2011 at 22:45, Steve Kargl
> <[email protected]> wrote:
> > On Mon, Apr 25, 2011 at 10:26:20PM +0300, Janne Blomqvist wrote:
> >> Hmm, I'd prefer if the warning was issued only with -Wsomething which
> >> would be included in -Wall. But I suppose this can be done as a
> >> follow-up patch.
> >
> > I thought about adding a -freal-q-constant option.
>
> -Wreal-q-constant, presumably?
>
Yes. I've implemented in the revised patch, and I've
updated the docs.
2011-04-26 Steven G. Kargl <[email protected]>
PR fortran/48720
* gfortran.texi: Document the 'Q' exponent-letter extension.
* invoke.texi: Document -Wreal-q-constant.
* lang.opt: Add -Wreal-q-constant option.
* gfortran.h: Add warn_real_q_constant to option struct.
* primary.c (match_real_constant): Use it. Accept 'Q' as
exponent-letter for REAL(16) real-literal-constant with a
fallback to REAL(10) or error if REAL(10) is not available.
* options.c (gfc_init_options, set_Wall) Set it.
(gfc_handle_option): Handle new option.
OK?
--
Steve
Index: gfortran.texi
===================================================================
--- gfortran.texi (revision 172974)
+++ gfortran.texi (working copy)
@@ -1237,6 +1237,7 @@ without warning.
* Missing period in FORMAT specifications::
* I/O item lists::
* BOZ literal constants::
+* @code{Q} exponent-letter::
* Real array indices::
* Unary operators::
* Implicitly convert LOGICAL and INTEGER values::
@@ -1427,6 +1428,18 @@ To support legacy codes, GNU Fortran all
of the @code{READ} statement, and the output item lists of the
@code{WRITE} and @code{PRINT} statements, to start with a comma.
+@node @code{Q} exponent-letter
+@subsection @code{Q} exponent-letter
+@cindex @code{Q} exponent-letter
+
+GNU Fortran accepts real literal constants with an exponent-letter
+of @code{Q}, for example, @code{1.23Q45}. The constant is interpreted
+as a @code{REAL(16)} entity on targets that suppports this type. If
+the target does not support @code{REAL(16)} but has a @code{REAL(10)}
+type, then the real-literal-constant will be interpreted as a
+@code{REAL(10)} entity. In the absence of @code{REAL(16)} and
+@code{REAL(10)}, an error will occur.
+
@node BOZ literal constants
@subsection BOZ literal constants
@cindex BOZ literal constants
Index: gfortran.h
===================================================================
--- gfortran.h (revision 172974)
+++ gfortran.h (working copy)
@@ -2189,6 +2189,7 @@ typedef struct
int warn_character_truncation;
int warn_array_temp;
int warn_align_commons;
+ int warn_real_q_constant;
int warn_unused_dummy_argument;
int max_errors;
Index: lang.opt
===================================================================
--- lang.opt (revision 172974)
+++ lang.opt (working copy)
@@ -242,6 +242,10 @@ Wintrinsics-std
Fortran Warning
Warn on intrinsics not part of the selected standard
+Wreal-q-constant
+Fortran Warning
+Warn about real-literal-constants with 'q' exponent-letter
+
Wreturn-type
Fortran Warning
; Documented in C
Index: invoke.texi
===================================================================
--- invoke.texi (revision 172974)
+++ invoke.texi (working copy)
@@ -134,12 +134,13 @@ by type. Explanations are in the follow
@item Error and Warning Options
@xref{Error and Warning Options,,Options to request or suppress errors
and warnings}.
-@gccoptlist{-fmax-errors=@var{n} @gol
--fsyntax-only -pedantic -pedantic-errors @gol
--Wall -Waliasing -Wampersand -Warray-bounds -Wcharacter-truncation @gol
--Wconversion -Wimplicit-interface -Wimplicit-procedure -Wline-truncation @gol
--Wintrinsics-std -Wsurprising -Wno-tabs -Wunderflow -Wunused-parameter @gol
--Wintrinsic-shadow -Wno-align-commons -Wfunction-elimination}
+@gccoptlist{-fmax-errors=@var{n}
+-fsyntax-only -pedantic -pedantic-errors -Wall @gol
+-Waliasing -Wampersand -Warray-bounds -Wcharacter-truncation @gol
+-Wconversion -Wimplicit-interface -Wimplicit-procedure -Wline-truncation @gol
+-Wintrinsics-std -Wreal-q-format -Wsurprising -Wno-tabs -Wunderflow @gol
+-Wunused-parameter -Wintrinsic-shadow -Wno-align-commons @gol
+-Wfunction-elimination}
@item Debugging Options
@xref{Debugging Options,,Options for debugging your program or GNU Fortran}.
@@ -694,7 +695,7 @@ we recommend avoiding and that we believ
This currently includes @option{-Waliasing}, @option{-Wampersand},
@option{-Wconversion}, @option{-Wsurprising}, @option{-Wintrinsics-std},
@option{-Wno-tabs}, @option{-Wintrinsic-shadow}, @option{-Wline-truncation},
-and @option{-Wunused}.
+@option{-Wreal-q-format} and @option{-Wunused}.
@item -Waliasing
@opindex @code{Waliasing}
@@ -782,6 +783,12 @@ it as @code{EXTERNAL} procedure because
be used to never trigger this behavior and always link to the intrinsic
regardless of the selected standard.
+@item -Wreal-q-constant
+@opindex @code{Wreal-q-constant}
+@cindex warnings, @code{q} exponent-letter
+Produce a warning if a real-literal-constant contains a @code{q}
+exponent-letter.
+
@item -Wsurprising
@opindex @code{Wsurprising}
@cindex warnings, suspicious code
Index: primary.c
===================================================================
--- primary.c (revision 172974)
+++ primary.c (working copy)
@@ -541,6 +541,17 @@ match_real_constant (gfc_expr **result,
goto done;
exp_char = c;
+
+ if (c == 'q')
+ {
+ if (gfc_notify_std (GFC_STD_GNU, "Extension: exponent-letter 'q' in "
+ "real-literal-constant at %C") == FAILURE)
+ return MATCH_ERROR;
+ else if (gfc_option.warn_real_q_constant)
+ gfc_warning("Extension: exponent-letter 'q' in real-literal-constant "
+ "at %C");
+ }
+
/* Scan exponent. */
c = gfc_next_ascii_char ();
count++;
@@ -616,6 +627,29 @@ done:
kind = gfc_default_double_kind;
break;
+ case 'q':
+ if (kind != -2)
+ {
+ gfc_error ("Real number at %C has a 'q' exponent and an explicit "
+ "kind");
+ goto cleanup;
+ }
+
+ /* The maximum possible real kind type parameter is 16. First, try
+ that for the kind, then fallback to trying kind=10 (Intel 80 bit)
+ extended precision. If neither value works, just given up. */
+ kind = 16;
+ if (gfc_validate_kind (BT_REAL, kind, true) < 0)
+ {
+ kind = 10;
+ if (gfc_validate_kind (BT_REAL, kind, true) < 0)
+ {
+ gfc_error ("Invalid real kind %d at %C", kind);
+ goto cleanup;
+ }
+ }
+ break;
+
default:
if (kind == -2)
kind = gfc_default_real_kind;
Index: options.c
===================================================================
--- options.c (revision 172974)
+++ options.c (working copy)
@@ -108,6 +108,7 @@ gfc_init_options (unsigned int decoded_o
gfc_option.warn_intrinsic_shadow = 0;
gfc_option.warn_intrinsics_std = 0;
gfc_option.warn_align_commons = 1;
+ gfc_option.warn_real_q_constant = 0;
gfc_option.warn_unused_dummy_argument = 0;
gfc_option.max_errors = 25;
@@ -455,6 +456,7 @@ set_Wall (int setting)
gfc_option.warn_intrinsic_shadow = setting;
gfc_option.warn_intrinsics_std = setting;
gfc_option.warn_character_truncation = setting;
+ gfc_option.warn_real_q_constant = setting;
gfc_option.warn_unused_dummy_argument = setting;
warn_unused = setting;
@@ -659,6 +661,10 @@ gfc_handle_option (size_t scode, const c
gfc_option.warn_align_commons = value;
break;
+ case OPT_Wreal_q_constant:
+ gfc_option.warn_real_q_constant = value;
+ break;
+
case OPT_Wunused_dummy_argument:
gfc_option.warn_unused_dummy_argument = value;
break;