Fortran: Improve -Wmissing-include-dirs warnings [PR55534]

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.
This commit is contained in:
Tobias Burnus 2021-09-22 20:58:35 +02:00
parent 8f571e6471
commit 83aac69883
17 changed files with 63 additions and 44 deletions

View 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

View 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);
}

View 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);

View 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;

View 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;

View 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";

View 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 *

View 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 }

View 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 }

View 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

View 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 }

View 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 }

View 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

View File

@ -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.

View 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.

View 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)$}

View 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)$}