Can I please ping this one? Thanks... https://gcc.gnu.org/pipermail/gcc-patches/2023-December/641247.html
-Lewis On Thu, Dec 21, 2023 at 7:37 AM Lewis Hyatt <lhy...@gmail.com> wrote: > > Hello- > > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80755 > > Here is a short fix for the ICE in libcpp noted in the PR. Bootstrap + > regtest all languages on x86-64 Linux. Is it OK please? Thanks! > > -Lewis > > -- >8 -- > > In libcpp/files.cc, the function _cpp_has_header(), which implements > __has_include and __has_include_next, does not check for a NULL return value > from search_path_head(), leading to an ICE tripping an assert when > _cpp_find_file() tries to use it. Fix it by checking for that case and > silently returning false instead. > > As suggested by the PR author, it is easiest to make a testcase by using > the -idirafter option. To enable that, also modify the dg-additional-options > testsuite procedure to make the global $srcdir available, since -idirafter > requires the full path. > > libcpp/ChangeLog: > > PR preprocessor/80755 > * files.cc (search_path_head): Add SUPPRESS_DIAGNOSTIC argument > defaulting to false. > (_cpp_has_header): Silently return false if the search path has been > exhausted, rather than issuing a diagnostic and then hitting an > assert. > > gcc/testsuite/ChangeLog: > > * lib/gcc-defs.exp (dg-additional-options): Make $srcdir usable in a > dg-additional-options directive. > * c-c++-common/cpp/has-include-next-2-dir/has-include-next-2.h: New > test. > * c-c++-common/cpp/has-include-next-2.c: New test. > --- > libcpp/files.cc | 12 ++++++++---- > .../cpp/has-include-next-2-dir/has-include-next-2.h | 3 +++ > gcc/testsuite/c-c++-common/cpp/has-include-next-2.c | 4 ++++ > gcc/testsuite/lib/gcc-defs.exp | 1 + > 4 files changed, 16 insertions(+), 4 deletions(-) > create mode 100644 > gcc/testsuite/c-c++-common/cpp/has-include-next-2-dir/has-include-next-2.h > create mode 100644 gcc/testsuite/c-c++-common/cpp/has-include-next-2.c > > diff --git a/libcpp/files.cc b/libcpp/files.cc > index 27301d79fa4..aaab4b13a6a 100644 > --- a/libcpp/files.cc > +++ b/libcpp/files.cc > @@ -181,7 +181,8 @@ static bool read_file_guts (cpp_reader *pfile, _cpp_file > *file, > static bool read_file (cpp_reader *pfile, _cpp_file *file, > location_t loc); > static struct cpp_dir *search_path_head (cpp_reader *, const char *fname, > - int angle_brackets, enum include_type); > + int angle_brackets, enum > include_type, > + bool suppress_diagnostic = false); > static const char *dir_name_of_file (_cpp_file *file); > static void open_file_failed (cpp_reader *pfile, _cpp_file *file, int, > location_t); > @@ -1041,7 +1042,7 @@ _cpp_mark_file_once_only (cpp_reader *pfile, _cpp_file > *file) > nothing left in the path, returns NULL. */ > static struct cpp_dir * > search_path_head (cpp_reader *pfile, const char *fname, int angle_brackets, > - enum include_type type) > + enum include_type type, bool suppress_diagnostic) > { > cpp_dir *dir; > _cpp_file *file; > @@ -1070,7 +1071,7 @@ search_path_head (cpp_reader *pfile, const char *fname, > int angle_brackets, > return make_cpp_dir (pfile, dir_name_of_file (file), > pfile->buffer ? pfile->buffer->sysp : 0); > > - if (dir == NULL) > + if (dir == NULL && !suppress_diagnostic) > cpp_error (pfile, CPP_DL_ERROR, > "no include path in which to search for %s", fname); > > @@ -2164,7 +2165,10 @@ bool > _cpp_has_header (cpp_reader *pfile, const char *fname, int angle_brackets, > enum include_type type) > { > - cpp_dir *start_dir = search_path_head (pfile, fname, angle_brackets, type); > + cpp_dir *start_dir = search_path_head (pfile, fname, angle_brackets, type, > + /* suppress_diagnostic = */ true); > + if (!start_dir) > + return false; > _cpp_file *file = _cpp_find_file (pfile, fname, start_dir, angle_brackets, > _cpp_FFK_HAS_INCLUDE, 0); > return file->err_no != ENOENT; > diff --git > a/gcc/testsuite/c-c++-common/cpp/has-include-next-2-dir/has-include-next-2.h > b/gcc/testsuite/c-c++-common/cpp/has-include-next-2-dir/has-include-next-2.h > new file mode 100644 > index 00000000000..1e4be6ce7a3 > --- /dev/null > +++ > b/gcc/testsuite/c-c++-common/cpp/has-include-next-2-dir/has-include-next-2.h > @@ -0,0 +1,3 @@ > +#if __has_include_next(<whatever>) > +/* This formerly led to an ICE when the current directory was the last one > in the path. */ > +#endif > diff --git a/gcc/testsuite/c-c++-common/cpp/has-include-next-2.c > b/gcc/testsuite/c-c++-common/cpp/has-include-next-2.c > new file mode 100644 > index 00000000000..4928d3e992c > --- /dev/null > +++ b/gcc/testsuite/c-c++-common/cpp/has-include-next-2.c > @@ -0,0 +1,4 @@ > +/* PR preprocessor/80755 */ > +/* { dg-do preprocess } */ > +/* { dg-additional-options "-idirafter > $srcdir/c-c++-common/cpp/has-include-next-2-dir" } */ > +#include <has-include-next-2.h> > diff --git a/gcc/testsuite/lib/gcc-defs.exp b/gcc/testsuite/lib/gcc-defs.exp > index fc569c18ad5..091520ff69e 100644 > --- a/gcc/testsuite/lib/gcc-defs.exp > +++ b/gcc/testsuite/lib/gcc-defs.exp > @@ -280,6 +280,7 @@ if { [info exists env(GCC_RUNTEST_PARALLELIZE_DIR)] \ > > proc dg-additional-options { args } { > upvar dg-extra-tool-flags extra-tool-flags > + global srcdir > > if { [llength $args] > 3 } { > error "[lindex $args 0]: too many arguments"