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<
|
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">>;
|
InGroup<DiagGroup<"include-next-outside-header">>;
|
||||||
def pp_include_macros_out_of_predefines : Error<
|
def pp_include_macros_out_of_predefines : Error<
|
||||||
"the #__include_macros directive is only for internal use by -imacros">;
|
"the #__include_macros directive is only for internal use by -imacros">;
|
||||||
def pp_include_next_absolute_path : Warning<
|
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">>;
|
InGroup<DiagGroup<"include-next-absolute-path">>;
|
||||||
def ext_c99_whitespace_required_after_macro_name : ExtWarn<
|
def ext_c99_whitespace_required_after_macro_name : ExtWarn<
|
||||||
"ISO C99 requires whitespace after the macro name">, InGroup<C99>;
|
"ISO C99 requires whitespace after the macro name">, InGroup<C99>;
|
||||||
|
|
|
@ -2085,6 +2085,10 @@ void Preprocessor::HandleIncludeNextDirective(SourceLocation HashLoc,
|
||||||
LookupFromFile = CurPPLexer->getFileEntry();
|
LookupFromFile = CurPPLexer->getFileEntry();
|
||||||
Lookup = nullptr;
|
Lookup = nullptr;
|
||||||
} else if (!Lookup) {
|
} 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);
|
Diag(IncludeNextTok, diag::pp_include_next_absolute_path);
|
||||||
} else {
|
} else {
|
||||||
// Start looking up in the next directory.
|
// 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