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:
parent
74f0e2cc39
commit
6d69fec645
|
@ -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>;
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
#define BAR 1
|
|
@ -0,0 +1 @@
|
|||
#include_next "bar.h"
|
|
@ -0,0 +1 @@
|
|||
#define BAR 2
|
|
@ -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
|
Loading…
Reference in New Issue