Improve the diagnostic for #include_next occurring in a file not found

in the include path.

Instead of making the incorrect claim that the included file has an
absolute path, describe the actual problem: the including file was found
either by absolute path, or relative to such a file, or relative to the
primary source file.

llvm-svn: 356712
This commit is contained in:
Richard Smith 2019-03-21 20:42:13 +00:00
parent 74f0e2cc39
commit 6d69fec645
6 changed files with 40 additions and 2 deletions

View File

@ -268,12 +268,14 @@ def err_pp_hash_error : Error<"%0">;
}
def pp_include_next_in_primary : Warning<
"#include_next in primary source file">,
"#include_next in primary source file; "
"will search from start of include path">,
InGroup<DiagGroup<"include-next-outside-header">>;
def pp_include_macros_out_of_predefines : Error<
"the #__include_macros directive is only for internal use by -imacros">;
def pp_include_next_absolute_path : Warning<
"#include_next with absolute path">,
"#include_next in file found relative to primary source file or found by "
"absolute path; will search from start of include path">,
InGroup<DiagGroup<"include-next-absolute-path">>;
def ext_c99_whitespace_required_after_macro_name : ExtWarn<
"ISO C99 requires whitespace after the macro name">, InGroup<C99>;

View File

@ -2085,6 +2085,10 @@ void Preprocessor::HandleIncludeNextDirective(SourceLocation HashLoc,
LookupFromFile = CurPPLexer->getFileEntry();
Lookup = nullptr;
} else if (!Lookup) {
// The current file was not found by walking the include path. Either it
// is the primary file (handled above), or it was found by absolute path,
// or it was found relative to such a file.
// FIXME: Track enough information so we know which case we're in.
Diag(IncludeNextTok, diag::pp_include_next_absolute_path);
} else {
// Start looking up in the next directory.

View File

@ -0,0 +1 @@
#define BAR 1

View File

@ -0,0 +1 @@
#include_next "bar.h"

View File

@ -0,0 +1 @@
#define BAR 2

View File

@ -0,0 +1,29 @@
// RUN: %clang_cc1 -verify %s -E -o /dev/null -I%S/Inputs/include-next-1 -I%S/Inputs/include-next-2 -DTEST=1
// RUN: %clang_cc1 -verify %s -E -o /dev/null -I%S/Inputs/include-next-1 -I%S/Inputs/include-next-2 -DTEST=2
// RUN: %clang_cc1 -verify %s -E -o /dev/null -I%S/Inputs/include-next-1 -I%S/Inputs/include-next-2 -DTEST=3
#if TEST == 1
// expected-warning@+1 {{#include_next in primary source file}}
#include_next "bar.h"
#if BAR != 1
#error wrong bar
#endif
#elif TEST == 2
// expected-no-diagnostics
#include "foo.h"
#if BAR != 2
#error wrong bar
#endif
#elif TEST == 3
// expected-warning@foo.h:1 {{#include_next in file found relative to primary source file or found by absolute path}}
#include "Inputs/include-next-1/foo.h"
#if BAR != 1
#error wrong bar
#endif
#undef BAR
#else
#error unknown test
#endif