Author: Nico Weber Date: 2020-05-08T13:33:39-04:00 New Revision: 51d938bc94433b03cfbe60758642dbe70269ae3b
URL: https://github.com/llvm/llvm-project/commit/51d938bc94433b03cfbe60758642dbe70269ae3b DIFF: https://github.com/llvm/llvm-project/commit/51d938bc94433b03cfbe60758642dbe70269ae3b.diff LOG: Fix bugs when an included file name is typo corrected. D52774 fixed a bug with typo correction of includes, but didn't add a test. D65907 then broke recovery of typo correction of includes again, because it extracted the code that writes to Filename to a separate function that took the parameter not by reference. Fix that, and also don't repeat the slash normalization computation and fix both lookup and regular file name after recovery. Differential Revision: https://reviews.llvm.org/D79595 Added: Modified: clang/include/clang/Lex/Preprocessor.h clang/lib/Lex/PPDirectives.cpp clang/test/Lexer/case-insensitive-include-pr31836.sh clang/test/Lexer/case-insensitive-include-win.c Removed: ################################################################################ diff --git a/clang/include/clang/Lex/Preprocessor.h b/clang/include/clang/Lex/Preprocessor.h index 7d358bded6e7..5cd017fa925f 100644 --- a/clang/include/clang/Lex/Preprocessor.h +++ b/clang/include/clang/Lex/Preprocessor.h @@ -2242,11 +2242,11 @@ class Preprocessor { }; Optional<FileEntryRef> LookupHeaderIncludeOrImport( - const DirectoryLookup *&CurDir, StringRef Filename, + const DirectoryLookup *&CurDir, StringRef &Filename, SourceLocation FilenameLoc, CharSourceRange FilenameRange, const Token &FilenameTok, bool &IsFrameworkFound, bool IsImportDecl, bool &IsMapped, const DirectoryLookup *LookupFrom, - const FileEntry *LookupFromFile, StringRef LookupFilename, + const FileEntry *LookupFromFile, StringRef &LookupFilename, SmallVectorImpl<char> &RelativePath, SmallVectorImpl<char> &SearchPath, ModuleMap::KnownHeader &SuggestedModule, bool isAngled); diff --git a/clang/lib/Lex/PPDirectives.cpp b/clang/lib/Lex/PPDirectives.cpp index 84c13b286e68..db249126d393 100644 --- a/clang/lib/Lex/PPDirectives.cpp +++ b/clang/lib/Lex/PPDirectives.cpp @@ -1716,11 +1716,11 @@ void Preprocessor::HandleIncludeDirective(SourceLocation HashLoc, } Optional<FileEntryRef> Preprocessor::LookupHeaderIncludeOrImport( - const DirectoryLookup *&CurDir, StringRef Filename, + const DirectoryLookup *&CurDir, StringRef& Filename, SourceLocation FilenameLoc, CharSourceRange FilenameRange, const Token &FilenameTok, bool &IsFrameworkFound, bool IsImportDecl, bool &IsMapped, const DirectoryLookup *LookupFrom, - const FileEntry *LookupFromFile, StringRef LookupFilename, + const FileEntry *LookupFromFile, StringRef& LookupFilename, SmallVectorImpl<char> &RelativePath, SmallVectorImpl<char> &SearchPath, ModuleMap::KnownHeader &SuggestedModule, bool isAngled) { Optional<FileEntryRef> File = LookupFile( @@ -1789,21 +1789,10 @@ Optional<FileEntryRef> Preprocessor::LookupHeaderIncludeOrImport( return Filename; }; StringRef TypoCorrectionName = CorrectTypoFilename(Filename); - -#ifndef _WIN32 - // Normalize slashes when compiling with -fms-extensions on non-Windows. - // This is unnecessary on Windows since the filesystem there handles - // backslashes. - SmallString<128> NormalizedTypoCorrectionPath; - if (LangOpts.MicrosoftExt) { - NormalizedTypoCorrectionPath = TypoCorrectionName; - llvm::sys::path::native(NormalizedTypoCorrectionPath); - TypoCorrectionName = NormalizedTypoCorrectionPath; - } -#endif + StringRef TypoCorrectionLookupName = CorrectTypoFilename(LookupFilename); Optional<FileEntryRef> File = LookupFile( - FilenameLoc, TypoCorrectionName, isAngled, LookupFrom, LookupFromFile, + FilenameLoc, TypoCorrectionLookupName, isAngled, LookupFrom, LookupFromFile, CurDir, Callbacks ? &SearchPath : nullptr, Callbacks ? &RelativePath : nullptr, &SuggestedModule, &IsMapped, /*IsFrameworkFound=*/nullptr); @@ -1818,6 +1807,7 @@ Optional<FileEntryRef> Preprocessor::LookupHeaderIncludeOrImport( // We found the file, so set the Filename to the name after typo // correction. Filename = TypoCorrectionName; + LookupFilename = TypoCorrectionLookupName; return File; } } @@ -2074,8 +2064,6 @@ Preprocessor::ImportAction Preprocessor::HandleHeaderIncludeOrImport( if (Callbacks && !IsImportDecl) { // Notify the callback object that we've seen an inclusion directive. // FIXME: Use a diff erent callback for a pp-import? - // FIXME: Passes wrong filename if LookupHeaderIncludeOrImport() did - // typo correction. Callbacks->InclusionDirective( HashLoc, IncludeTok, LookupFilename, isAngled, FilenameRange, File ? &File->getFileEntry() : nullptr, SearchPath, RelativePath, @@ -2102,7 +2090,6 @@ Preprocessor::ImportAction Preprocessor::HandleHeaderIncludeOrImport( !IsMapped && !File->getFileEntry().tryGetRealPathName().empty(); if (CheckIncludePathPortability) { - // FIXME: Looks at the wrong filename if we did typo correction. StringRef Name = LookupFilename; StringRef NameWithoriginalSlashes = Filename; #if defined(_WIN32) diff --git a/clang/test/Lexer/case-insensitive-include-pr31836.sh b/clang/test/Lexer/case-insensitive-include-pr31836.sh index b60e6ca6ff2b..4639b631bd3c 100644 --- a/clang/test/Lexer/case-insensitive-include-pr31836.sh +++ b/clang/test/Lexer/case-insensitive-include-pr31836.sh @@ -2,7 +2,8 @@ // RUN: mkdir -p %t // RUN: touch %t/case-insensitive-include-pr31836.h -// RUN: echo "#include \"%t/Case-Insensitive-Include-Pr31836.h\"" | %clang_cc1 -E - 2>&1 | FileCheck %s +// RUN: echo "#include \"\\\\\\\\?\\\\%t/Case-Insensitive-Include-Pr31836.h\"" | not %clang_cc1 -E - 2>&1 | FileCheck %s +// CHECK: error: {{.*}}file not found, did you mean // CHECK: warning: non-portable path to file // CHECK-SAME: /case-insensitive-include-pr31836.h diff --git a/clang/test/Lexer/case-insensitive-include-win.c b/clang/test/Lexer/case-insensitive-include-win.c index f88fa80ffa95..6a17d0b55244 100644 --- a/clang/test/Lexer/case-insensitive-include-win.c +++ b/clang/test/Lexer/case-insensitive-include-win.c @@ -5,6 +5,6 @@ // REQUIRES: system-windows // RUN: mkdir -p %t.dir // RUN: touch %t.dir/foo.h -// RUN: not %clang_cl /FI\\?\%t.dir\FOO.h /WX -Xclang -verify -fsyntax-only %s 2>&1 | FileCheck %s +// RUN: not %clang_cl /FI\\?\%t.dir\FOO.h /WX -fsyntax-only %s 2>&1 | FileCheck %s // CHECK: non-portable path to file '"\\?\ _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits