[Fortran] move more diagnostics to the common machinery
diff mbox

Message ID CAESRpQBfPi1C5x401z8hioTXnR7T30FAG3quThfKT_FoqmqJiQ@mail.gmail.com
State New
Headers show

Commit Message

Manuel López-Ibáñez Oct. 3, 2014, 9:29 p.m. UTC
The following patch adds two new functions. One of them is an overload
of gfc_warning_cmdline() that takes an option. Thus now we get:

f951: Warning: Nonexistent include directory
'C:\msys\1.0.10\home\FX\ibin\i586-pc-mingw32\libgfortran/../../../trunk/libgfortran/generated'
[-Wmissing-include-dirs]

plus colors!

and of course, with -Werror=missing-include-dirs you get:

f951: Error: Nonexistent include directory
'C:\msys\1.0.10\home\FX\ibin\i586-pc-mingw32\libgfortran/../../../trunk/libgfortran/generated'
[-Werror=missing-include-dirs]
f951: some warnings being treated as errors

The other new function is for errors instead of warnings. Perhaps
there are more places where these functions can be used.

Bootstrapped and regression tested on x86_64-linux-gnu.

OK?

gcc/fortran/ChangeLog:

2014-10-03  Manuel López-Ibáñez  <manu@gcc.gnu.org>

    * gfortran.h (gfc_warning_cmdline): Add overload variant taking an
    option.
    (gfc_error_cmdline): Declare.
    * error.c (gfc_warning_cmdline): New
    (gfc_error_cmdline): New.
    * scanner.c (add_path_to_list): Use them.
    (load_file): Likewise.

Comments

Manuel López-Ibáñez Oct. 4, 2014, 2:05 p.m. UTC | #1
On 3 October 2014 23:29, Manuel López-Ibáñez <lopezibanez@gmail.com> wrote:
> The following patch adds two new functions. One of them is an overload
> of gfc_warning_cmdline() that takes an option. Thus now we get:

Don't review this one just yet. I must have messed up testing or new
testcases appeared  because after doing 'svn up' some testcases
started failing. I am testing a new patch.

Cheers,

Manuel.

Patch
diff mbox

Index: gcc/fortran/gfortran.h
===================================================================
--- gcc/fortran/gfortran.h	(revision 214251)
+++ gcc/fortran/gfortran.h	(working copy)
@@ -2690,16 +2690,18 @@  void gfc_buffer_error (int);
 
 const char *gfc_print_wide_char (gfc_char_t);
 
 void gfc_warning (const char *, ...) ATTRIBUTE_GCC_GFC(1,2);
 void gfc_warning_now (const char *, ...) ATTRIBUTE_GCC_GFC(1,2);
-void gfc_warning_cmdline (const char *gmsgid, ...) ATTRIBUTE_GCC_GFC(1,2);
+bool gfc_warning_cmdline (const char *gmsgid, ...) ATTRIBUTE_GCC_GFC(1,2);
+bool gfc_warning_cmdline (int opt, const char *gmsgid, ...) ATTRIBUTE_GCC_GFC(2,3);
 
 void gfc_clear_warning (void);
 void gfc_warning_check (void);
 
 void gfc_error (const char *, ...) ATTRIBUTE_GCC_GFC(1,2);
+void gfc_error_cmdline (const char *gmsgid, ...) 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);
 void gfc_internal_error (const char *, ...) ATTRIBUTE_NORETURN ATTRIBUTE_GCC_GFC(1,2);
 void gfc_clear_error (void);
 int gfc_error_check (void);
Index: gcc/fortran/error.c
===================================================================
--- gcc/fortran/error.c	(revision 214251)
+++ gcc/fortran/error.c	(working copy)
@@ -1050,25 +1050,61 @@  gfc_diagnostic_finalizer (diagnostic_con
 {
   pp_destroy_prefix (context->printer);
   pp_newline_and_flush (context->printer);
 }
 
 /* Give a warning about the command-line.  */
 
-void
+bool
+gfc_warning_cmdline (int opt, const char *gmsgid, ...)
+{
+  va_list argp;
+  diagnostic_info diagnostic;
+  bool ret;
+
+  va_start (argp, gmsgid);
+  diagnostic_set_info (&diagnostic, gmsgid, &argp, UNKNOWN_LOCATION,
+		       DK_WARNING);
+  diagnostic.option_index = opt;
+  ret = report_diagnostic (&diagnostic);
+  va_end (argp);
+  return ret;
+}
+
+
+/* Give a warning about the command-line.  */
+
+bool
 gfc_warning_cmdline (const char *gmsgid, ...)
 {
   va_list argp;
   diagnostic_info diagnostic;
+  bool ret;
 
   va_start (argp, gmsgid);
   diagnostic_set_info (&diagnostic, gmsgid, &argp, UNKNOWN_LOCATION,
 		       DK_WARNING);
+  ret = report_diagnostic (&diagnostic);
+  va_end (argp);
+  return ret;
+}
+
+
+/* Give an error about the command-line.  */
+
+void
+gfc_error_cmdline (const char *gmsgid, ...)
+{
+  va_list argp;
+  diagnostic_info diagnostic;
+
+  va_start (argp, gmsgid);
+  diagnostic_set_info (&diagnostic, gmsgid, &argp, UNKNOWN_LOCATION, DK_ERROR);
   report_diagnostic (&diagnostic);
   va_end (argp);
 }
 
 /* Clear the warning flag.  */
 
 void
 gfc_clear_warning (void)
 {
Index: gcc/fortran/scanner.c
===================================================================
--- gcc/fortran/scanner.c	(revision 214251)
+++ gcc/fortran/scanner.c	(working copy)
@@ -322,23 +322,20 @@  add_path_to_list (gfc_directorylist **li
     q[i--] = '\0';
 
   if (stat (q, &st))
     {
       if (errno != ENOENT)
-	gfc_warning_now ("Include directory \"%s\": %s", path,
-			 xstrerror(errno));
-      else
-	{
-	  /* FIXME:  Also support -Wmissing-include-dirs.  */
-	  if (warn)
-	    gfc_warning_now ("Nonexistent include directory \"%s\"", path);
-	}
+	gfc_warning_cmdline ("Include directory %qs: %s", path,
+			     xstrerror(errno));
+      else if (warn)
+	gfc_warning_cmdline (OPT_Wmissing_include_dirs,
+			     "Nonexistent include directory %qs", path);
       return;
     }
   else if (!S_ISDIR (st.st_mode))
     {
-      gfc_warning_now ("\"%s\" is not a directory", path);
+      gfc_warning_cmdline ("%qs is not a directory", path);
       return;
     }
 
   if (head || *list == NULL)
     {
@@ -1923,11 +1920,11 @@  load_file (const char *realfilename, con
 	}
       else
 	input = gfc_open_file (realfilename);
       if (input == NULL)
 	{
-	  gfc_error_now ("Can't open file '%s'", filename);
+	  gfc_error_cmdline ("Can't open file %qs", filename);
 	  return false;
 	}
     }
   else
     {