]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fortran: Improve -Wmissing-include-dirs warnings [PR55534]
authorTobias Burnus <tobias@codesourcery.com>
Wed, 22 Sep 2021 18:58:35 +0000 (20:58 +0200)
committerTobias Burnus <tobias@codesourcery.com>
Wed, 22 Sep 2021 18:58:35 +0000 (20:58 +0200)
It turned out that enabling the -Wmissing-include-dirs for libcpp did output
too many warnings – at least as run with -B and similar options during the
GCC build and warning for internal include dirs like finclude, unlikely of
relevance to for a real-world user.
This patch now only warns for -I and -J by default but permits to get the
full warnings including libcpp ones with -Wmissing-include-dirs. It
additionally documents this in the manual.

With that change, the -Wno-missing-include-dirs could be removed
from libgfortran's configure and libgomp's testsuite always cflags.
This reverts those bits of the previous
commit r12-3722-g417ea5c02cef7f000e66d1af22b066c2c1cda047

Additionally, it turned out that all call to load_file called exit
explicitly - except for the main file via gfc_init -> gfc_new_file. The
latter also output a file not existing fatal error, such that two errors
where printed. Now exit is called in line with the other users of
load_file.

Finally, when compileing with "nonexisting/file.f90", first a warning that
"nonexisting" does not exist as include path was printed before the file
not found error was printed. Now the directory in which the physical file
is located is added silently, relying on the file-not-found diagnostic for
those.

PR fortran/55534
gcc/ChangeLog:

* doc/invoke.texi (-Wno-missing-include-dirs.): Document Fortran
behavior.

gcc/fortran/ChangeLog:

* cpp.c (gfc_cpp_register_include_paths, gfc_cpp_post_options):
Add new bool verbose_missing_dir_warn argument.
* cpp.h (gfc_cpp_post_options): Update prototype.
* f95-lang.c (gfc_init): Remove duplicated file-not found diag.
* gfortran.h (gfc_check_include_dirs): Takes bool
verbose_missing_dir_warn arg.
(gfc_new_file): Returns now void.
* options.c (gfc_post_options): Update to warn for -I and -J,
only, by default but for all when user requested.
* scanner.c (gfc_do_check_include_dir):
(gfc_do_check_include_dirs, gfc_check_include_dirs): Take bool
verbose warn arg and update to avoid printing the same message
twice or never.
(load_file): Fix indent.
(gfc_new_file): Return void and exit when load_file failed
as all other load_file users do.

libgfortran/ChangeLog:

* configure.ac (AM_FCFLAGS): Revert r12-3722 by removing
-Wno-missing-include-dirs.
* configure: Regenerate.

libgomp/ChangeLog:

* testsuite/libgomp.fortran/fortran.exp (ALWAYS_CFLAGS): Revert
r12-3722 by removing -Wno-missing-include-dirs.
* testsuite/libgomp.oacc-fortran/fortran.exp (ALWAYS_CFLAGS): Likewise.

gcc/testsuite/ChangeLog:

* gfortran.dg/include_14.f90: Add -J testcase and update dg-output.
* gfortran.dg/include_15.f90: Likewise.
* gfortran.dg/include_16.f90: Likewise.
* gfortran.dg/include_17.f90: Likewise.
* gfortran.dg/include_18.f90: Likewise.
* gfortran.dg/include_19.f90: Likewise.

17 files changed:
gcc/doc/invoke.texi
gcc/fortran/cpp.c
gcc/fortran/cpp.h
gcc/fortran/f95-lang.c
gcc/fortran/gfortran.h
gcc/fortran/options.c
gcc/fortran/scanner.c
gcc/testsuite/gfortran.dg/include_14.f90
gcc/testsuite/gfortran.dg/include_15.f90
gcc/testsuite/gfortran.dg/include_16.f90
gcc/testsuite/gfortran.dg/include_17.f90
gcc/testsuite/gfortran.dg/include_18.f90
gcc/testsuite/gfortran.dg/include_19.f90
libgfortran/configure
libgfortran/configure.ac
libgomp/testsuite/libgomp.fortran/fortran.exp
libgomp/testsuite/libgomp.oacc-fortran/fortran.exp

index 4acb94181d252d9278c84109506c23d4d0ba65a7..ba98eab68a5814099388f8c2bfdc01d50069c2be 100644 (file)
@@ -6459,10 +6459,12 @@ int b[2][2] = @{ @{ 0, 1 @}, @{ 2, 3 @} @};
 
 This warning is enabled by @option{-Wall}.
 
-@item -Wmissing-include-dirs @r{(C, C++, Objective-C and Objective-C++ only)}
+@item -Wmissing-include-dirs @r{(C, C++, Objective-C, Objective-C++ and Fortran only)}
 @opindex Wmissing-include-dirs
 @opindex Wno-missing-include-dirs
-Warn if a user-supplied include directory does not exist.
+Warn if a user-supplied include directory does not exist. This opions is disabled
+by default for C, C++, Objective-C and Objective-C++. For Fortran, it is partially
+enabled by default by warning for -I and -J, only.
 
 @item -Wno-missing-profile
 @opindex Wmissing-profile
index 3ff895455e95193e91714964d6c37b7a46cd556a..e86386c8b17de18f926799a187825966a24b1f7e 100644 (file)
@@ -245,11 +245,12 @@ gfc_cpp_temporary_file (void)
 }
 
 static void
-gfc_cpp_register_include_paths (void)
+gfc_cpp_register_include_paths (bool verbose_missing_dir_warn)
 {
   int cxx_stdinc = 0;
   cpp_get_options (cpp_in)->warn_missing_include_dirs
-    = global_options.x_cpp_warn_missing_include_dirs;
+    = (global_options.x_cpp_warn_missing_include_dirs
+       && verbose_missing_dir_warn);
   register_include_chains (cpp_in, gfc_cpp_option.sysroot,
                           gfc_cpp_option.prefix, gfc_cpp_option.multilib,
                           gfc_cpp_option.standard_include_paths, cxx_stdinc,
@@ -484,7 +485,7 @@ gfc_cpp_init_cb (void)
 }
 
 void
-gfc_cpp_post_options (void)
+gfc_cpp_post_options (bool verbose_missing_dir_warn)
 {
   /* Any preprocessing-related option without '-cpp' is considered
      an error.  */
@@ -547,7 +548,7 @@ gfc_cpp_post_options (void)
   diagnostic_initialize_input_context (global_dc, nullptr, true);
   gfc_cpp_init_cb ();
 
-  gfc_cpp_register_include_paths ();
+  gfc_cpp_register_include_paths (verbose_missing_dir_warn);
 }
 
 
index 5cb7e5a9c342181d85834be6c1b27c5de9766882..44644a2a333d945549c175cdafc049efdcbf6c3a 100644 (file)
@@ -41,7 +41,7 @@ void gfc_cpp_init_options (unsigned int decoded_options_count,
 
 int gfc_cpp_handle_option(size_t scode, const char *arg, int value);
 
-void gfc_cpp_post_options (void);
+void gfc_cpp_post_options (bool);
 
 bool gfc_cpp_preprocess (const char *source_file);
 
index 026228da09f29ee2ed4b3b20e94894037aaf968a..58dcaf01d757de3cabe31148a29feddd1503df2e 100644 (file)
@@ -259,8 +259,8 @@ gfc_init (void)
 
   gfc_init_1 ();
 
-  if (!gfc_new_file ())
-    fatal_error (input_location, "cannot open input file: %s", gfc_source_file);
+  /* Calls exit in case of a fail. */
+  gfc_new_file ();
 
   if (flag_preprocess_only)
     return false;
index 3c7a8434d07964e1762da7e20d75c13be126e991..7ef835b211a1e81564f7996a90df0c85badb4302 100644 (file)
@@ -3032,7 +3032,7 @@ void gfc_scanner_init_1 (void);
 void gfc_add_include_path (const char *, bool, bool, bool, bool);
 void gfc_add_intrinsic_modules_path (const char *);
 void gfc_release_include_path (void);
-void gfc_check_include_dirs (void);
+void gfc_check_include_dirs (bool);
 FILE *gfc_open_included_file (const char *, bool, bool);
 
 int gfc_at_end (void);
@@ -3064,7 +3064,7 @@ gfc_char_t gfc_peek_char (void);
 char gfc_peek_ascii_char (void);
 void gfc_error_recovery (void);
 void gfc_gobble_whitespace (void);
-bool gfc_new_file (void);
+void gfc_new_file (void);
 const char * gfc_read_orig_filename (const char *, const char **);
 
 extern gfc_source_form gfc_current_form;
index d789397515ade91d8c11f181083add439bb9a84e..016b70443aec23ea67f45129150cbe4f2128dfce 100644 (file)
@@ -251,14 +251,20 @@ gfc_post_options (const char **pfilename)
 {
   const char *filename = *pfilename, *canon_source_file = NULL;
   char *source_path;
+  bool verbose_missing_dir_warn;
   int i;
 
   /* This needs to be after the commandline has been processed.
      In Fortran, the options is by default enabled, in C/C++
-     by default disabled.  */
+     by default disabled.
+     If not enabled explicitly by the user, only warn for -I
+     and -J, otherwise warn for all include paths.  */
+  verbose_missing_dir_warn
+    = (global_options_set.x_cpp_warn_missing_include_dirs
+       && global_options.x_cpp_warn_missing_include_dirs);
   SET_OPTION_IF_UNSET (&global_options, &global_options_set,
                       cpp_warn_missing_include_dirs, 1);
-  gfc_check_include_dirs ();
+  gfc_check_include_dirs (verbose_missing_dir_warn);
 
   /* Finalize DEC flags.  */
   post_dec_flags (flag_dec);
@@ -339,10 +345,13 @@ gfc_post_options (const char **pfilename)
       source_path = (char *) alloca (i + 1);
       memcpy (source_path, canon_source_file, i);
       source_path[i] = 0;
-      gfc_add_include_path (source_path, true, true, true, false);
+      /* Only warn if the directory is different from the input file as
+        if that one is not found, already an error is shown.  */
+      bool warn = gfc_option.flag_preprocessed && gfc_source_file != filename;
+      gfc_add_include_path (source_path, true, true, warn, false);
     }
   else
-    gfc_add_include_path (".", true, true, true, false);
+    gfc_add_include_path (".", true, true, false, false);
 
   if (canon_source_file != gfc_source_file)
     free (CONST_CAST (char *, canon_source_file));
@@ -490,7 +499,7 @@ gfc_post_options (const char **pfilename)
     gfc_fatal_error ("Maximum subrecord length cannot exceed %d",
                     MAX_SUBRECORD_LENGTH);
 
-  gfc_cpp_post_options ();
+  gfc_cpp_post_options (verbose_missing_dir_warn);
 
   if (gfc_option.allow_std & GFC_STD_F2008)
     lang_hooks.name = "GNU Fortran2008";
index 6fe74bd5b8d26b8962d9d90a9f40fe6d207c01b5..52124bd5d361f843a1a80a60cb2eb12518b902c4 100644 (file)
@@ -307,9 +307,9 @@ gfc_do_check_include_dir (const char *path, bool warn)
       if (errno != ENOENT)
        gfc_warning_now (0, "Include directory %qs: %s",
                         path, xstrerror(errno));
-      else if (warn && !gfc_cpp_enabled ())
+      else if (warn)
          gfc_warning_now (OPT_Wmissing_include_dirs,
-                            "Nonexistent include directory %qs", path);
+                          "Nonexistent include directory %qs", path);
       return false;
     }
   else if (!S_ISDIR (st.st_mode))
@@ -323,7 +323,7 @@ gfc_do_check_include_dir (const char *path, bool warn)
 /* In order that -W(no-)missing-include-dirs works, the diagnostic can only be
    run after processing the commandline.  */
 static void
-gfc_do_check_include_dirs (gfc_directorylist **list)
+gfc_do_check_include_dirs (gfc_directorylist **list, bool do_warn)
 {
   gfc_directorylist *prev, *q, *n;
   prev = NULL;
@@ -331,7 +331,7 @@ gfc_do_check_include_dirs (gfc_directorylist **list)
   while (n)
     {
       q = n; n = n->next;
-      if (gfc_do_check_include_dir (q->path, q->warn))
+      if (gfc_do_check_include_dir (q->path, q->warn && do_warn))
        {
          prev = q;
          continue;
@@ -346,10 +346,16 @@ gfc_do_check_include_dirs (gfc_directorylist **list)
 }
 
 void
-gfc_check_include_dirs ()
+gfc_check_include_dirs (bool verbose_missing_dir_warn)
 {
-  gfc_do_check_include_dirs (&include_dirs);
-  gfc_do_check_include_dirs (&intrinsic_modules_dirs);
+  /* This is a bit convoluted: If gfc_cpp_enabled () and
+     verbose_missing_dir_warn, the warning is shown by libcpp. Otherwise,
+     it is shown here, still conditional on OPT_Wmissing_include_dirs.  */
+  bool warn = !gfc_cpp_enabled () || !verbose_missing_dir_warn;
+  gfc_do_check_include_dirs (&include_dirs, warn);
+  gfc_do_check_include_dirs (&intrinsic_modules_dirs, verbose_missing_dir_warn);
+  if (gfc_option.module_dir && gfc_cpp_enabled ())
+    gfc_do_check_include_dirs (&include_dirs, true);
 }
 
 /* Adds path to the list pointed to by list.  */
@@ -2771,7 +2777,7 @@ load_file (const char *realfilename, const char *displayedname, bool initial)
    it tries to determine the source form from the filename, defaulting
    to free form.  */
 
-bool
+void
 gfc_new_file (void)
 {
   bool result;
@@ -2789,6 +2795,9 @@ gfc_new_file (void)
   else
     result = load_file (gfc_source_file, NULL, true);
 
+  if (!result)
+    exit (FATAL_EXIT_CODE);
+
   gfc_current_locus.lb = line_head;
   gfc_current_locus.nextc = (line_head == NULL) ? NULL : line_head->line;
 
@@ -2799,8 +2808,6 @@ gfc_new_file (void)
 
   exit (SUCCESS_EXIT_CODE);
 #endif
-
-  return result;
 }
 
 static char *
index b306b2c813b9f2179476d24d7096f51759f4bdf2..8110e49bf4305066cbc256c1e55be70583c0294b 100644 (file)
@@ -1,5 +1,6 @@
-! { dg-additional-options "-cpp -idirafter /fdaf/ -I bar" }
+! { dg-additional-options "-cpp -idirafter /fdaf/ -I bar -J foo/bar" }
 end
+! default: warn for -I and -J but ignore other options.
+! { dg-warning "Nonexistent include directory 'bar/'" "" { target *-*-* } 0 }
+! { dg-warning "Nonexistent include directory 'foo/bar/'" "" { target *-*-* } 0 }
 
-! { dg-warning "/fdaf/: No such file or directory" "" { target *-*-* } 0 }
-! { dg-warning "bar: No such file or directory" "" { target *-*-* } 0 }
index 4944282f931bf2fcdb252c7fcce012bffd8e731c..068dcef5826fe3de7928b076d05b9c4c7a2ac042 100644 (file)
@@ -1,5 +1,6 @@
-! { dg-additional-options "-cpp -idirafter /fdaf/ -I bar -Wmissing-include-dirs" }
+! { dg-additional-options "-cpp -idirafter /fdaf/ -I bar -J foo/bar -Wmissing-include-dirs" }
 end
 
-! { dg-warning "/fdaf/: No such file or directory" "" { target *-*-* } 0 }
-! { dg-warning "bar: No such file or directory" "" { target *-*-* } 0 }
+! { dg-warning " /fdaf/: No such file or directory" "" { target *-*-* } 0 }
+! { dg-warning " bar: No such file or directory" "" { target *-*-* } 0 }
+! { dg-warning " foo/bar: No such file or directory" "" { target *-*-* } 0 }
index 45794f28e735a35957db69f32d4d2a583ba86055..65e4c7efdaddf433b3a6422745c0275306f4c639 100644 (file)
@@ -1,2 +1,2 @@
-! { dg-additional-options "-cpp -idirafter /fdaf/ -I bar -Wno-missing-include-dirs" }
+! { dg-additional-options "-cpp -idirafter /fdaf/ -I bar -J foo/bar -Wno-missing-include-dirs" }
 end
index 0ed5c86d323ccd769306f153a6f55fa421d4c881..06677590be3432f83c134a4738c7673639fe43b5 100644 (file)
@@ -1,4 +1,6 @@
 ! { dg-do compile }
-! { dg-options "-I foo-bar -Wno-missing-include-dirs" }
+! { dg-options "-I foo-bar -J foo/bar" }
 end 
+! { dg-warning "Nonexistent include directory 'foo-bar/'" "" { target *-*-* } 0 }
+! { dg-warning "Nonexistent include directory 'foo/bar/'" "" { target *-*-* } 0 }
 
index ca69df382fede4c890f5541127bdcd92b00c3cd9..b74a585bf1be8746f69c69a427aac2c9f00c220f 100644 (file)
@@ -1,3 +1,5 @@
 ! { dg-do compile }
-! { dg-options "-I nothere -Wno-missing-include-dirs" }
+! { dg-options "-I nothere -J neither/here -Wmissing-include-dirs" }
 end 
+! { dg-warning "Nonexistent include directory 'nothere/'" "" { target *-*-* } 0 }
+! { dg-warning "Nonexistent include directory 'neither/here/'" "" { target *-*-* } 0 }
index 2a068174b7e67a4ca4dd72f28df4d943b5681625..740492952810d8f19aec721c18c0ae4695c1ce68 100644 (file)
@@ -1,4 +1,4 @@
 ! { dg-do compile }
-! { dg-options "-J foobar/foo -Wno-missing-include-dirs" }
+! { dg-options "-I nothere -J foobar/foo -Wno-missing-include-dirs" }
 program main
 end program main
index 350159aa4fed1b6987a7a0c84ff5188642d78d0a..4810b9b032e3bb96076ea34c3ffb6779b5b41704 100755 (executable)
@@ -5985,7 +5985,7 @@ fi
 
 # Add -Wall -fno-repack-arrays -fno-underscoring if we are using GCC.
 if test "x$GCC" = "xyes"; then
-  AM_FCFLAGS="-I . -Wall -Werror -fimplicit-none -fno-repack-arrays -fno-underscoring -Wno-missing-include-dirs"
+  AM_FCFLAGS="-I . -Wall -Werror -fimplicit-none -fno-repack-arrays -fno-underscoring"
   ## We like to use C11 and C99 routines when available.  This makes
   ## sure that
   ## __STDC_VERSION__ is set such that libc includes make them available.
index a3550b4e5d07d802aa346fb34992577aa713dc3e..a77509801e68b88ba9b01b4fd6c7fbc76fbebedd 100644 (file)
@@ -146,7 +146,7 @@ AM_PROG_CC_C_O
 
 # Add -Wall -fno-repack-arrays -fno-underscoring if we are using GCC.
 if test "x$GCC" = "xyes"; then
-  AM_FCFLAGS="-I . -Wall -Werror -fimplicit-none -fno-repack-arrays -fno-underscoring -Wno-missing-include-dirs"
+  AM_FCFLAGS="-I . -Wall -Werror -fimplicit-none -fno-repack-arrays -fno-underscoring"
   ## We like to use C11 and C99 routines when available.  This makes
   ## sure that
   ## __STDC_VERSION__ is set such that libc includes make them available.
index 912dd2a743e89fec4378e75943a1e377e96cb87f..eb701311b6a05b1ce943d4087adeee5918a7ffe6 100644 (file)
@@ -20,9 +20,6 @@ dg-init
 
 # Turn on OpenMP.
 lappend ALWAYS_CFLAGS "additional_flags=-fopenmp"
-# Silence warnings due to explicitly passed but nonexisting
-# -isystem <instdir>/target>/{sys-,}include (gfortran warns by default)
-lappend ALWAYS_CFLAGS "additional_flags=-Wno-missing-include-dirs"
 
 if { $blddir != "" } {
     set lang_source_re {^.*\.[fF](|90|95|03|08)$}
index 22e91eca256f4c4ddf0becae128a0d1db426d8d7..7365b320668aad63130004771fd6b5d3f4f440d2 100644 (file)
@@ -22,9 +22,6 @@ dg-init
 
 # Turn on OpenACC.
 lappend ALWAYS_CFLAGS "additional_flags=-fopenacc"
-# Silence warnings due to explicitly passed but nonexisting
-# -isystem <instdir>/target>/{sys-,}include (gfortran warns by default)
-lappend ALWAYS_CFLAGS "additional_flags=-Wno-missing-include-dirs"
 
 if { $blddir != "" } {
     set lang_source_re {^.*\.[fF](|90|95|03|08)$}