diff options
Diffstat (limited to 'clang/lib/Lex/HeaderSearch.cpp')
-rw-r--r-- | clang/lib/Lex/HeaderSearch.cpp | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/clang/lib/Lex/HeaderSearch.cpp b/clang/lib/Lex/HeaderSearch.cpp index 99c92e91aad5..d5adbcf62cbc 100644 --- a/clang/lib/Lex/HeaderSearch.cpp +++ b/clang/lib/Lex/HeaderSearch.cpp @@ -727,7 +727,7 @@ diagnoseFrameworkInclude(DiagnosticsEngine &Diags, SourceLocation IncludeLoc, if (!isAngled && !FoundByHeaderMap) { SmallString<128> NewInclude("<"); if (IsIncludeeInFramework) { - NewInclude += StringRef(ToFramework).drop_back(10); // drop .framework + NewInclude += ToFramework.str().drop_back(10); // drop .framework NewInclude += "/"; } NewInclude += IncludeFilename; @@ -1834,7 +1834,7 @@ std::string HeaderSearch::suggestPathToFileForDiagnostics( }; for (unsigned I = 0; I != SearchDirs.size(); ++I) { - // FIXME: Support this search within frameworks and header maps. + // FIXME: Support this search within frameworks. if (!SearchDirs[I].isNormalDir()) continue; @@ -1848,6 +1848,19 @@ std::string HeaderSearch::suggestPathToFileForDiagnostics( if (!BestPrefixLength && CheckDir(path::parent_path(MainFile)) && IsSystem) *IsSystem = false; + // Try resolving resulting filename via reverse search in header maps, + // key from header name is user prefered name for the include file. + StringRef Filename = File.drop_front(BestPrefixLength); + for (unsigned I = 0; I != SearchDirs.size(); ++I) { + if (!SearchDirs[I].isHeaderMap()) + continue; - return path::convert_to_slash(File.drop_front(BestPrefixLength)); + StringRef SpelledFilename = + SearchDirs[I].getHeaderMap()->reverseLookupFilename(Filename); + if (!SpelledFilename.empty()) { + Filename = SpelledFilename; + break; + } + } + return path::convert_to_slash(Filename); } |