[PATCH, Fortran] Allow warnings given through gfc_error to associate with warning flags

Fritz Reese fritzoreese@gmail.com
Tue Nov 1 15:10:00 GMT 2016


All,

Currently warnings given by the GNU Fortran front-end typically
indicate which flag controls the warning, if any, as given by the
first argument to gfc_warning. However, there is no support for
controlling warnings which are emitted by gfc_error when
warnings_not_errors is set. Herein I propose a patch such that when a
call to gfc_error may cause a warning, suppression of the warning can
be controlled with a -W* warning flag, as with other warnings.

The simple patch extends the gfc_error interface to also accept an
additional 'opt' arg, which is passed as the same first argument to
gfc_warning if warnings_not_errors causes a warning instead of an
error. The old interface remains, so that a default 'opt' of 0 is
passed when gfc_error is called with no 'opt' argument. This minimizes
the impact of the interface change on existing code. Note also that if
the call to gfc_error would actually cause an error, the warning flag
will not suppress the error.

See the patch for details. Bootstraps and regtests on x86_64-redhat-linux.

Another patch proposal will follow which utilizes this functionality
to introduce a new warning -W[no-]argument-mismatch, assuming this one
is OK.

---
Fritz Reese

From: Fritz Reese <fritzoreese@gmail.com>
Date: Thu, 27 Oct 2016 13:33:57 -0400
Subject: [PATCH] Allow warning flags to associate through gfc_error.

        gcc/fortran/
        * gfortran.h (gfc_error): New declaration for gfc_error with 'opt'.
        * error.c (gfc_error): Add optional 'opt' argument.
        * error.c (gfc_notify_std): Call fully-qualified gfc_error.
-------------- next part --------------
diff --git a/gcc/fortran/error.c b/gcc/fortran/error.c
index fe91419..0fd8a4e 100644
--- a/gcc/fortran/error.c
+++ b/gcc/fortran/error.c
@@ -67,7 +67,7 @@ gfc_push_suppress_errors (void)
 }
 
 static void
-gfc_error (const char *gmsgid, va_list ap)  ATTRIBUTE_GCC_GFC(1,0);
+gfc_error (int opt, const char *gmsgid, va_list ap)  ATTRIBUTE_GCC_GFC(2,0);
 
 static bool
 gfc_warning (int opt, const char *gmsgid, va_list ap) ATTRIBUTE_GCC_GFC(2,0);
@@ -902,7 +902,7 @@ gfc_notify_std (int std, const char *gmsgid, ...)
   if (warning)
     gfc_warning (0, buffer, argp);
   else
-    gfc_error (buffer, argp);
+    gfc_error (0, buffer, argp);
   va_end (argp);
 
   return (warning && !warnings_are_errors) ? true : false;
@@ -1233,7 +1233,7 @@ gfc_warning_check (void)
 /* Issue an error.  */
 
 static void
-gfc_error (const char *gmsgid, va_list ap)
+gfc_error (int opt, const char *gmsgid, va_list ap)
 {
   va_list argp;
   va_copy (argp, ap);
@@ -1241,7 +1241,7 @@ gfc_error (const char *gmsgid, va_list ap)
 
   if (warnings_not_errors)
     {
-      gfc_warning (/*opt=*/0, gmsgid, argp);
+      gfc_warning (opt, gmsgid, argp);
       va_end (argp);
       return;
     }
@@ -1289,11 +1289,21 @@ gfc_error (const char *gmsgid, va_list ap)
 
 
 void
+gfc_error (int opt, const char *gmsgid, ...)
+{
+  va_list argp;
+  va_start (argp, gmsgid);
+  gfc_error (opt, gmsgid, argp);
+  va_end (argp);
+}
+
+
+void
 gfc_error (const char *gmsgid, ...)
 {
   va_list argp;
   va_start (argp, gmsgid);
-  gfc_error (gmsgid, argp);
+  gfc_error (0, gmsgid, argp);
   va_end (argp);
 }
 
diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
index a0dcf6d..3fb6f41 100644
--- a/gcc/fortran/gfortran.h
+++ b/gcc/fortran/gfortran.h
@@ -2731,6 +2731,7 @@ bool gfc_warning_now_at (location_t loc, int opt, const char *gmsgid, ...)
 void gfc_clear_warning (void);
 void gfc_warning_check (void);
 
+void gfc_error (int opt, const char *, ...) ATTRIBUTE_GCC_GFC(2,3);
 void gfc_error (const char *, ...) ATTRIBUTE_GCC_GFC(1,2);
 void gfc_error_now (const char *, ...) ATTRIBUTE_GCC_GFC(1,2);
 void gfc_fatal_error (const char *, ...) ATTRIBUTE_NORETURN ATTRIBUTE_GCC_GFC(1,2);


More information about the Gcc-patches mailing list