From patchwork Tue Apr 26 16:52:58 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve Kargl X-Patchwork-Id: 92940 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 81BC9B6F08 for ; Wed, 27 Apr 2011 02:53:26 +1000 (EST) Received: (qmail 9316 invoked by alias); 26 Apr 2011 16:53:18 -0000 Received: (qmail 9128 invoked by uid 22791); 26 Apr 2011 16:53:14 -0000 X-SWARE-Spam-Status: No, hits=-1.9 required=5.0 tests=AWL, BAYES_00, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from troutmask.apl.washington.edu (HELO troutmask.apl.washington.edu) (128.95.76.21) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 26 Apr 2011 16:53:00 +0000 Received: from troutmask.apl.washington.edu (localhost.apl.washington.edu [127.0.0.1]) by troutmask.apl.washington.edu (8.14.4/8.14.4) with ESMTP id p3QGqxtL005033; Tue, 26 Apr 2011 09:52:59 -0700 (PDT) (envelope-from sgk@troutmask.apl.washington.edu) Received: (from sgk@localhost) by troutmask.apl.washington.edu (8.14.4/8.14.4/Submit) id p3QGqwxl005032; Tue, 26 Apr 2011 09:52:58 -0700 (PDT) (envelope-from sgk) Date: Tue, 26 Apr 2011 09:52:58 -0700 From: Steve Kargl To: Janne Blomqvist Cc: fortran@gcc.gnu.org, gcc-patches@gcc.gnu.org Subject: Re: [PATCH, Fortran] Handle 'q' exponent-letter in real-literal-constant Message-ID: <20110426165258.GA5025@troutmask.apl.washington.edu> References: <20110425184207.GA7936@troutmask.apl.washington.edu> <20110425194555.GA6747@troutmask.apl.washington.edu> Mime-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.4.2.3i Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org On Mon, Apr 25, 2011 at 11:15:35PM +0300, Janne Blomqvist wrote: > On Mon, Apr 25, 2011 at 22:45, Steve Kargl > 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 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? 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;