forked from OSchip/llvm-project
Adding a fixit for includes that cannot be found with angle brackets, but can be found with quoted strings instead. Implements PR13201.
llvm-svn: 160406
This commit is contained in:
parent
4b12ba0ce6
commit
8f94ac6922
|
@ -279,6 +279,8 @@ def note_macro_here : Note<"macro %0 defined here">;
|
||||||
|
|
||||||
def err_pp_invalid_directive : Error<"invalid preprocessing directive">;
|
def err_pp_invalid_directive : Error<"invalid preprocessing directive">;
|
||||||
def err_pp_file_not_found : Error<"'%0' file not found">, DefaultFatal;
|
def err_pp_file_not_found : Error<"'%0' file not found">, DefaultFatal;
|
||||||
|
def err_pp_file_not_found_not_fatal : Error<
|
||||||
|
"'%0' file not found with <angled> include; use \"quotes\" instead">;
|
||||||
def err_pp_error_opening_file : Error<
|
def err_pp_error_opening_file : Error<
|
||||||
"error opening file '%0': %1">, DefaultFatal;
|
"error opening file '%0': %1">, DefaultFatal;
|
||||||
def err_pp_empty_filename : Error<"empty filename">;
|
def err_pp_empty_filename : Error<"empty filename">;
|
||||||
|
|
|
@ -1390,9 +1390,28 @@ void Preprocessor::HandleIncludeDirective(SourceLocation HashLoc,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (File == 0) {
|
if (File == 0) {
|
||||||
if (!SuppressIncludeNotFoundError)
|
if (!SuppressIncludeNotFoundError) {
|
||||||
Diag(FilenameTok, diag::err_pp_file_not_found) << Filename;
|
// If the file could not be located and it was included via angle
|
||||||
return;
|
// brackets, we can attempt a lookup as though it were a quoted path to
|
||||||
|
// provide the user with a possible fixit.
|
||||||
|
if (isAngled) {
|
||||||
|
File = LookupFile(Filename, false, LookupFrom, CurDir,
|
||||||
|
Callbacks ? &SearchPath : 0,
|
||||||
|
Callbacks ? &RelativePath : 0,
|
||||||
|
getLangOpts().Modules ? &SuggestedModule : 0);
|
||||||
|
if (File) {
|
||||||
|
SourceRange Range(FilenameTok.getLocation(), CharEnd);
|
||||||
|
Diag(FilenameTok, diag::err_pp_file_not_found_not_fatal) <<
|
||||||
|
Filename <<
|
||||||
|
FixItHint::CreateReplacement(Range, "\"" + Filename.str() + "\"");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If the file is still not found, just go with the vanilla diagnostic
|
||||||
|
if (!File)
|
||||||
|
Diag(FilenameTok, diag::err_pp_file_not_found) << Filename;
|
||||||
|
}
|
||||||
|
if (!File)
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we are supposed to import a module rather than including the header,
|
// If we are supposed to import a module rather than including the header,
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -Wall -pedantic -verify %s
|
||||||
|
// RUN: cp %s %t
|
||||||
|
// RUN: cp %S/fixit-include.h %T
|
||||||
|
// RUN: not %clang_cc1 -fsyntax-only -fixit %t
|
||||||
|
// RUN: %clang_cc1 -Wall -pedantic %t
|
||||||
|
|
||||||
|
#include <fixit-include.h> // expected-error {{'fixit-include.h' file not found with <angled> include; use "quotes" instead}}
|
||||||
|
|
||||||
|
#pragma does_not_exist // expected-warning {{unknown pragma ignored}}
|
||||||
|
|
||||||
|
int main( void ) {
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
// This file is purposefully left empty
|
Loading…
Reference in New Issue