From 8cfbe6a31ad51cb19046607ad6b792638e69b88e Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Wed, 30 Nov 2011 18:12:06 +0000 Subject: [PATCH] Move the module auto-import logic after the logic that allows a callback client to suggest an alternative search path and after we complain when the included file can't be found. The former can't be tested in isolation, the latter doesn't actually matter (because we won't make a module suggestion if no header is available). However, the flow is better this way. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@145502 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Lex/PPDirectives.cpp | 58 ++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/lib/Lex/PPDirectives.cpp b/lib/Lex/PPDirectives.cpp index 98362dfd57..9e5757f03d 100644 --- a/lib/Lex/PPDirectives.cpp +++ b/lib/Lex/PPDirectives.cpp @@ -1280,6 +1280,35 @@ void Preprocessor::HandleIncludeDirective(SourceLocation HashLoc, Callbacks ? &SearchPath : NULL, Callbacks ? &RelativePath : NULL, AutoModuleImport? &SuggestedModule : 0); + if (Callbacks) { + if (!File) { + // Give the clients a chance to recover. + llvm::SmallString<128> RecoveryPath; + if (Callbacks->FileNotFound(Filename, RecoveryPath)) { + if (const DirectoryEntry *DE = FileMgr.getDirectory(RecoveryPath)) { + // Add the recovery path to the list of search paths. + DirectoryLookup DL(DE, SrcMgr::C_User, true, false); + HeaderInfo.AddSearchPath(DL, isAngled); + + // Try the lookup again, skipping the cache. + File = LookupFile(Filename, isAngled, LookupFrom, CurDir, 0, 0, + AutoModuleImport ? &SuggestedModule : 0, + /*SkipCache*/true); + } + } + } + + // Notify the callback object that we've seen an inclusion directive. + Callbacks->InclusionDirective(HashLoc, IncludeTok, Filename, isAngled, File, + End, SearchPath, RelativePath); + } + + if (File == 0) { + if (!SuppressIncludeNotFoundError) + Diag(FilenameTok, diag::err_pp_file_not_found) << Filename; + return; + } + // If we are supposed to import a module rather than including the header, // do so now. if (SuggestedModule) { @@ -1335,35 +1364,6 @@ void Preprocessor::HandleIncludeDirective(SourceLocation HashLoc, return; } - if (Callbacks) { - if (!File) { - // Give the clients a chance to recover. - llvm::SmallString<128> RecoveryPath; - if (Callbacks->FileNotFound(Filename, RecoveryPath)) { - if (const DirectoryEntry *DE = FileMgr.getDirectory(RecoveryPath)) { - // Add the recovery path to the list of search paths. - DirectoryLookup DL(DE, SrcMgr::C_User, true, false); - HeaderInfo.AddSearchPath(DL, isAngled); - - // Try the lookup again, skipping the cache. - File = LookupFile(Filename, isAngled, LookupFrom, CurDir, 0, 0, - AutoModuleImport ? &SuggestedModule : 0, - /*SkipCache*/true); - } - } - } - - // Notify the callback object that we've seen an inclusion directive. - Callbacks->InclusionDirective(HashLoc, IncludeTok, Filename, isAngled, File, - End, SearchPath, RelativePath); - } - - if (File == 0) { - if (!SuppressIncludeNotFoundError) - Diag(FilenameTok, diag::err_pp_file_not_found) << Filename; - return; - } - // The #included file will be considered to be a system header if either it is // in a system include directory, or if the #includer is a system include // header. -- 2.50.1