|
@@ -24,9 +24,6 @@
|
|
|
#include "clang/Lex/ModuleLoader.h"
|
|
|
#include "clang/Lex/Pragma.h"
|
|
|
#include "llvm/ADT/APInt.h"
|
|
|
-#include "llvm/ADT/STLExtras.h"
|
|
|
-#include "llvm/ADT/StringExtras.h"
|
|
|
-#include "llvm/ADT/iterator_range.h"
|
|
|
#include "llvm/Support/ErrorHandling.h"
|
|
|
#include "llvm/Support/Path.h"
|
|
|
#include "llvm/Support/SaveAndRestore.h"
|
|
@@ -1559,41 +1556,6 @@ static void diagnoseAutoModuleImport(
|
|
|
("@import " + PathString + ";").str());
|
|
|
}
|
|
|
|
|
|
-namespace {
|
|
|
- // Given a vector of path components and a string containing the real
|
|
|
- // path to the file, build a properly-cased replacement in the vector,
|
|
|
- // and return true if the replacement should be suggested.
|
|
|
- bool TrySimplifyPath(SmallVectorImpl<StringRef> &Components,
|
|
|
- StringRef RealPathName) {
|
|
|
- auto RealPathComponentIter = llvm::sys::path::rbegin(RealPathName);
|
|
|
- auto RealPathComponentEnd = llvm::sys::path::rend(RealPathName);
|
|
|
- int Cnt = 0;
|
|
|
- bool SuggestReplacement = false;
|
|
|
- // Below is a best-effort to handle ".." in paths. It is admittedly
|
|
|
- // not 100% correct in the presence of symlinks.
|
|
|
- for(auto &Component : llvm::reverse(Components)) {
|
|
|
- if ("." == Component) {
|
|
|
- } else if (".." == Component) {
|
|
|
- ++Cnt;
|
|
|
- } else if (Cnt) {
|
|
|
- --Cnt;
|
|
|
- } else if (RealPathComponentIter != RealPathComponentEnd) {
|
|
|
- if (Component != *RealPathComponentIter) {
|
|
|
- // If these path components differ by more than just case, then we
|
|
|
- // may be looking at symlinked paths. Bail on this diagnostic to avoid
|
|
|
- // noisy false positives.
|
|
|
- SuggestReplacement = RealPathComponentIter->equals_lower(Component);
|
|
|
- if (!SuggestReplacement)
|
|
|
- break;
|
|
|
- Component = *RealPathComponentIter;
|
|
|
- }
|
|
|
- ++RealPathComponentIter;
|
|
|
- }
|
|
|
- }
|
|
|
- return SuggestReplacement;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
/// HandleIncludeDirective - The "\#include" tokens have just been read, read
|
|
|
/// the file to be included from the lexer, then include it! This is a common
|
|
|
/// routine with functionality shared between \#include, \#include_next and
|
|
@@ -1758,35 +1720,6 @@ void Preprocessor::HandleIncludeDirective(SourceLocation HashLoc,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // Issue a diagnostic if the name of the file on disk has a different case
|
|
|
- // than the one we're about to open.
|
|
|
- const bool CheckIncludePathPortability =
|
|
|
- File && !File->tryGetRealPathName().empty();
|
|
|
-
|
|
|
- if (CheckIncludePathPortability) {
|
|
|
- StringRef Name = LangOpts.MSVCCompat ? NormalizedPath.c_str() : Filename;
|
|
|
- StringRef RealPathName = File->tryGetRealPathName();
|
|
|
- SmallVector<StringRef, 16> Components(llvm::sys::path::begin(Name),
|
|
|
- llvm::sys::path::end(Name));
|
|
|
-
|
|
|
- if (TrySimplifyPath(Components, RealPathName)) {
|
|
|
- SmallString<128> Path;
|
|
|
- Path.reserve(Name.size()+2);
|
|
|
- Path.push_back(isAngled ? '<' : '"');
|
|
|
- for (auto Component : Components) {
|
|
|
- Path.append(Component);
|
|
|
- // Append the separator the user used, or the close quote
|
|
|
- Path.push_back(
|
|
|
- Path.size() <= Filename.size() ? Filename[Path.size()-1] :
|
|
|
- (isAngled ? '>' : '"'));
|
|
|
- }
|
|
|
- auto Replacement = Path.str().str();
|
|
|
- SourceRange Range(FilenameTok.getLocation(), CharEnd);
|
|
|
- Diag(FilenameTok, diag::pp_nonportable_path) << Replacement <<
|
|
|
- FixItHint::CreateReplacement(Range, Replacement);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
// Should we enter the source file? Set to false if either the source file is
|
|
|
// known to have no effect beyond its effect on module visibility -- that is,
|
|
|
// if it's got an include guard that is already defined or is a modular header
|