Index: clang/include/clang/Lex/Preprocessor.h =================================================================== --- clang/include/clang/Lex/Preprocessor.h +++ clang/include/clang/Lex/Preprocessor.h @@ -2242,11 +2242,11 @@ }; Optional 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 &RelativePath, SmallVectorImpl &SearchPath, ModuleMap::KnownHeader &SuggestedModule, bool isAngled); Index: clang/lib/Lex/PPDirectives.cpp =================================================================== --- clang/lib/Lex/PPDirectives.cpp +++ clang/lib/Lex/PPDirectives.cpp @@ -1716,11 +1716,11 @@ } Optional 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 &RelativePath, SmallVectorImpl &SearchPath, ModuleMap::KnownHeader &SuggestedModule, bool isAngled) { Optional File = LookupFile( @@ -1789,21 +1789,10 @@ 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 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 @@ // We found the file, so set the Filename to the name after typo // correction. Filename = TypoCorrectionName; + LookupFilename = TypoCorrectionLookupName; return File; } } @@ -2074,8 +2064,6 @@ if (Callbacks && !IsImportDecl) { // Notify the callback object that we've seen an inclusion directive. // FIXME: Use a different 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 @@ !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) Index: clang/test/Lexer/case-insensitive-include-pr31836.sh =================================================================== --- clang/test/Lexer/case-insensitive-include-pr31836.sh +++ 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 Index: clang/test/Lexer/case-insensitive-include-win.c =================================================================== --- clang/test/Lexer/case-insensitive-include-win.c +++ 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 '"\\?\