r271708 - Use the name of the file on disk to issue a new diagnostic about non-portable #include and #import paths.

Nico Weber via cfe-commits cfe-commits at lists.llvm.org
Fri Jun 3 15:01:29 PDT 2016


It's not just windows.h, but windows sdk headers in general (#include
<winsock2.h>, #include <ws2tcpip.h> #include <wspiapi.h> #include
<dbghelp.h> etc). Here's what the warning does on the first few files in
Chromium:
https://build.chromium.org/p/chromium.fyi/builders/ClangToTWin/builds/8155/steps/compile/logs/stdio
(We add /FIIntrin.h -- but it looks like MSVC's intrin.h is called intrin.h
while clang's is called Intrin.h, which is probably a bug in clang).

I think in general clang's philosophy is that warnings should be useful
enough that they should be able to be on by default, so not having it on by
default should be some last resort. Better to try and make it work well
enough that it can be enabled :-)




On Fri, Jun 3, 2016 at 5:54 PM, Eric Niebler <eniebler at fb.com> wrote:

> I can investigate the system header issue. And I could add a special
> exception for <windows.h> if folks feel that that’s the right thing to do.
> If we’re really worried about how noisy this warning could be, the warning
> could be disabled by default. Thoughts?
>
>
>
> Eric
>
>
>
>
>
> On 6/3/16, 2:46 PM, "thakis at google.com on behalf of Nico Weber" <
> thakis at google.com on behalf of thakis at chromium.org> wrote:
>
>
>
> Also, once that is resolved, this warning tells people that #include
> <windows.h> is wrong:
>
>
>
> ..\..\third_party\ffmpeg\compat/w32pthreads.h(39,10):  warning:
> non-portable path to file '<Windows.h>'; specified path differs in case
> from file name on disk [-Wnonportable-include-path]
>
> #include <windows.h>
>
>          ^~~~~~~~~~~
>
>          <Windows.h>
>
>
>
> I don't think that's realistically fixable; about all the code in the
> world includes windows.h as windows.h...any ideas what the Windows story
> for this warning should be?
>
>
>
> On Fri, Jun 3, 2016 at 5:43 PM, Nico Weber <thakis at chromium.org> wrote:
>
> I'm getting lots of warnings like so:
>
>
>
> In file included from
> ..\..\tools\win\static_initializers\static_initializers.cc:5:
>
> C:\b\depot_tools\win_toolchain\vs_files\95ddda401ec5678f15eeed01d2bee08fcbc5ee97\DIA
> SDK\include\dia2.h(30,10):  error: non-portable path to file '"Windows.h"';
> specified path differs in case from file name on disk
> [-Werror,-Wnonportable-include-path]
>
> #include "windows.h"
>
>          ^~~~~~~~~~~
>
>          "Windows.h"
>
>
>
> dia2.h is a system include, and we include it in the search path via
> -imsvc. Normally warnings aren't emitted for system headers. Do you know
> why this is happening here?
>
>
>
> On Fri, Jun 3, 2016 at 2:52 PM, Taewook Oh via cfe-commits <
> cfe-commits at lists.llvm.org> wrote:
>
> Author: twoh
> Date: Fri Jun  3 13:52:51 2016
> New Revision: 271708
>
> URL: http://llvm.org/viewvc/llvm-project?rev=271708&view=rev
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D271708-26view-3Drev&d=CwMFaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=t4UJXwtMcIwGvgOaMqGzrQ&m=V9o7pyPA6lC6C5vc83jcUDQl3QUmGLtRDdBUFqIUYc8&s=Gn4UbgHFrY0dCPaPeH59zNo_KJYr9z3TDI7vBbG7XRs&e=>
> Log:
> Use the name of the file on disk to issue a new diagnostic about
> non-portable #include and #import paths.
>
> Differential Revision: http://reviews.llvm.org/D19843
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D19843&d=CwMFaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=t4UJXwtMcIwGvgOaMqGzrQ&m=V9o7pyPA6lC6C5vc83jcUDQl3QUmGLtRDdBUFqIUYc8&s=QUpSpSdu6fmWjTXFJjR1wpr7M_9MvIaff7xlfRVXQ14&e=>
> Corresponding LLVM change: http://reviews.llvm.org/D19842
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D19842&d=CwMFaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=t4UJXwtMcIwGvgOaMqGzrQ&m=V9o7pyPA6lC6C5vc83jcUDQl3QUmGLtRDdBUFqIUYc8&s=DQhKLK_syXeWqpQei3-4snZNgN55KGrKo7-HeOUnyd0&e=>
>
> Patch by Eric Niebler
>
>
> Added:
>     cfe/trunk/test/Lexer/Inputs/case-insensitive-include.h
>     cfe/trunk/test/Lexer/case-insensitive-include-ms.c
>     cfe/trunk/test/Lexer/case-insensitive-include.c
> Modified:
>     cfe/trunk/include/clang/Basic/DiagnosticGroups.td
>     cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td
>     cfe/trunk/include/clang/Basic/FileManager.h
>     cfe/trunk/include/clang/Basic/VirtualFileSystem.h
>     cfe/trunk/include/clang/Lex/DirectoryLookup.h
>     cfe/trunk/include/clang/Lex/HeaderSearch.h
>     cfe/trunk/lib/Basic/FileManager.cpp
>     cfe/trunk/lib/Basic/VirtualFileSystem.cpp
>     cfe/trunk/lib/Lex/HeaderSearch.cpp
>     cfe/trunk/lib/Lex/PPDirectives.cpp
>     cfe/trunk/test/PCH/case-insensitive-include.c
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticGroups.td
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticGroups.td?rev=271708&r1=271707&r2=271708&view=diff
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_include_clang_Basic_DiagnosticGroups.td-3Frev-3D271708-26r1-3D271707-26r2-3D271708-26view-3Ddiff&d=CwMFaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=t4UJXwtMcIwGvgOaMqGzrQ&m=V9o7pyPA6lC6C5vc83jcUDQl3QUmGLtRDdBUFqIUYc8&s=6a-TsQHt64u-EuN1pPvtq22mZURs4e_3hnyjfo8_NT0&e=>
>
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticGroups.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticGroups.td Fri Jun  3 13:52:51
> 2016
> @@ -390,6 +390,7 @@ def : DiagGroup<"sequence-point", [Unseq
>  def AmbiguousMacro : DiagGroup<"ambiguous-macro">;
>  def KeywordAsMacro : DiagGroup<"keyword-macro">;
>  def ReservedIdAsMacro : DiagGroup<"reserved-id-macro">;
> +def NonportableIncludePath : DiagGroup<"nonportable-include-path">;
>
>  // Just silence warnings about -Wstrict-aliasing for now.
>  def : DiagGroup<"strict-aliasing=0">;
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td?rev=271708&r1=271707&r2=271708&view=diff
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_include_clang_Basic_DiagnosticLexKinds.td-3Frev-3D271708-26r1-3D271707-26r2-3D271708-26view-3Ddiff&d=CwMFaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=t4UJXwtMcIwGvgOaMqGzrQ&m=V9o7pyPA6lC6C5vc83jcUDQl3QUmGLtRDdBUFqIUYc8&s=LqasKiMnb63oRC7lQEkw66_6fF3Y6FFaKKVR4iQxrzg&e=>
>
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td Fri Jun  3
> 13:52:51 2016
> @@ -274,6 +274,10 @@ def ext_missing_whitespace_after_macro_n
>    "whitespace required after macro name">;
>  def warn_missing_whitespace_after_macro_name : Warning<
>    "whitespace recommended after macro name">;
> +def pp_nonportable_path : Warning<
> +  "non-portable path to file '%0'; specified path differs in case from
> file"
> +  " name on disk">,
> +  InGroup<NonportableIncludePath>;
>
>  def pp_pragma_once_in_main_file : Warning<"#pragma once in main file">,
>    InGroup<DiagGroup<"pragma-once-outside-header">>;
>
> Modified: cfe/trunk/include/clang/Basic/FileManager.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/FileManager.h?rev=271708&r1=271707&r2=271708&view=diff
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_include_clang_Basic_FileManager.h-3Frev-3D271708-26r1-3D271707-26r2-3D271708-26view-3Ddiff&d=CwMFaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=t4UJXwtMcIwGvgOaMqGzrQ&m=V9o7pyPA6lC6C5vc83jcUDQl3QUmGLtRDdBUFqIUYc8&s=R9GHDP8ViXNbktJxnd4Tuvrs15IaYbLJIadMFaOMQig&e=>
>
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/FileManager.h (original)
> +++ cfe/trunk/include/clang/Basic/FileManager.h Fri Jun  3 13:52:51 2016
> @@ -52,6 +52,7 @@ public:
>  /// descriptor for the file.
>  class FileEntry {
>    const char *Name;           // Name of the file.
> +  std::string RealPathName;   // Real path to the file; could be empty.
>    off_t Size;                 // File size in bytes.
>    time_t ModTime;             // Modification time of file.
>    const DirectoryEntry *Dir;  // Directory file lives in.
> @@ -82,6 +83,7 @@ public:
>    }
>
>    const char *getName() const { return Name; }
> +  StringRef tryGetRealPathName() const { return RealPathName; }
>    bool isValid() const { return IsValid; }
>    off_t getSize() const { return Size; }
>    unsigned getUID() const { return UID; }
>
> Modified: cfe/trunk/include/clang/Basic/VirtualFileSystem.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/VirtualFileSystem.h?rev=271708&r1=271707&r2=271708&view=diff
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_include_clang_Basic_VirtualFileSystem.h-3Frev-3D271708-26r1-3D271707-26r2-3D271708-26view-3Ddiff&d=CwMFaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=t4UJXwtMcIwGvgOaMqGzrQ&m=V9o7pyPA6lC6C5vc83jcUDQl3QUmGLtRDdBUFqIUYc8&s=7Hd1P3b4Ro1OGdLwKWztSvAoklCLzw1aHQhHEO6fa5c&e=>
>
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/VirtualFileSystem.h (original)
> +++ cfe/trunk/include/clang/Basic/VirtualFileSystem.h Fri Jun  3 13:52:51
> 2016
> @@ -91,6 +91,13 @@ public:
>    virtual ~File();
>    /// \brief Get the status of the file.
>    virtual llvm::ErrorOr<Status> status() = 0;
> +  /// \brief Get the name of the file
> +  virtual llvm::ErrorOr<StringRef> getName() {
> +    if (auto Status = status())
> +      return Status->getName();
> +    else
> +      return Status.getError();
> +  }
>    /// \brief Get the contents of the file as a \p MemoryBuffer.
>    virtual llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>>
>    getBuffer(const Twine &Name, int64_t FileSize = -1,
>
> Modified: cfe/trunk/include/clang/Lex/DirectoryLookup.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/DirectoryLookup.h?rev=271708&r1=271707&r2=271708&view=diff
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_include_clang_Lex_DirectoryLookup.h-3Frev-3D271708-26r1-3D271707-26r2-3D271708-26view-3Ddiff&d=CwMFaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=t4UJXwtMcIwGvgOaMqGzrQ&m=V9o7pyPA6lC6C5vc83jcUDQl3QUmGLtRDdBUFqIUYc8&s=OhWyW_LKPRug90vhjDFTdvTo4ikKC51n0syP7jzQnng&e=>
>
> ==============================================================================
> --- cfe/trunk/include/clang/Lex/DirectoryLookup.h (original)
> +++ cfe/trunk/include/clang/Lex/DirectoryLookup.h Fri Jun  3 13:52:51 2016
> @@ -151,6 +151,9 @@ public:
>    ///
>    /// \param HS The header search instance to search with.
>    ///
> +  /// \param IncludeLoc the source location of the #include or #import
> +  /// directive.
> +  ///
>    /// \param SearchPath If not NULL, will be set to the search path
> relative
>    /// to which the file was found.
>    ///
> @@ -172,6 +175,7 @@ public:
>    /// a framework include ("Foo.h" -> "Foo/Foo.h"), set the new name to
> this
>    /// vector and point Filename to it.
>    const FileEntry *LookupFile(StringRef &Filename, HeaderSearch &HS,
> +                              SourceLocation IncludeLoc,
>                                SmallVectorImpl<char> *SearchPath,
>                                SmallVectorImpl<char> *RelativePath,
>                                Module *RequestingModule,
>
> Modified: cfe/trunk/include/clang/Lex/HeaderSearch.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/HeaderSearch.h?rev=271708&r1=271707&r2=271708&view=diff
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_include_clang_Lex_HeaderSearch.h-3Frev-3D271708-26r1-3D271707-26r2-3D271708-26view-3Ddiff&d=CwMFaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=t4UJXwtMcIwGvgOaMqGzrQ&m=V9o7pyPA6lC6C5vc83jcUDQl3QUmGLtRDdBUFqIUYc8&s=X01mGHnmQJI9GpFof5nXfV-DNdzEUpEOvPo9h9k2XbA&e=>
>
> ==============================================================================
> --- cfe/trunk/include/clang/Lex/HeaderSearch.h (original)
> +++ cfe/trunk/include/clang/Lex/HeaderSearch.h Fri Jun  3 13:52:51 2016
> @@ -580,8 +580,9 @@ private:
>    /// \brief Look up the file with the specified name and determine its
> owning
>    /// module.
>    const FileEntry *
> -  getFileAndSuggestModule(StringRef FileName, const DirectoryEntry *Dir,
> -                          bool IsSystemHeaderDir, Module
> *RequestingModule,
> +  getFileAndSuggestModule(StringRef FileName, SourceLocation IncludeLoc,
> +                          const DirectoryEntry *Dir, bool
> IsSystemHeaderDir,
> +                          Module *RequestingModule,
>                            ModuleMap::KnownHeader *SuggestedModule);
>
>  public:
>
> Modified: cfe/trunk/lib/Basic/FileManager.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/FileManager.cpp?rev=271708&r1=271707&r2=271708&view=diff
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_Basic_FileManager.cpp-3Frev-3D271708-26r1-3D271707-26r2-3D271708-26view-3Ddiff&d=CwMFaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=t4UJXwtMcIwGvgOaMqGzrQ&m=V9o7pyPA6lC6C5vc83jcUDQl3QUmGLtRDdBUFqIUYc8&s=iwFjomqJaFszI0DLsHSzZ9VNuXIEx0GWp1DK0mISi_w&e=>
>
> ==============================================================================
> --- cfe/trunk/lib/Basic/FileManager.cpp (original)
> +++ cfe/trunk/lib/Basic/FileManager.cpp Fri Jun  3 13:52:51 2016
> @@ -312,6 +312,9 @@ const FileEntry *FileManager::getFile(St
>    UFE.InPCH = Data.InPCH;
>    UFE.File = std::move(F);
>    UFE.IsValid = true;
> +  if (UFE.File)
> +    if (auto RealPathName = UFE.File->getName())
> +      UFE.RealPathName = RealPathName->str();
>    return &UFE;
>  }
>
>
> Modified: cfe/trunk/lib/Basic/VirtualFileSystem.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/VirtualFileSystem.cpp?rev=271708&r1=271707&r2=271708&view=diff
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_Basic_VirtualFileSystem.cpp-3Frev-3D271708-26r1-3D271707-26r2-3D271708-26view-3Ddiff&d=CwMFaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=t4UJXwtMcIwGvgOaMqGzrQ&m=V9o7pyPA6lC6C5vc83jcUDQl3QUmGLtRDdBUFqIUYc8&s=jFhS-FsgQBiSB7NDX0Z5qqpeWYxyJwkbcldbl5gcd0s&e=>
>
> ==============================================================================
> --- cfe/trunk/lib/Basic/VirtualFileSystem.cpp (original)
> +++ cfe/trunk/lib/Basic/VirtualFileSystem.cpp Fri Jun  3 13:52:51 2016
> @@ -140,16 +140,19 @@ namespace {
>  class RealFile : public File {
>    int FD;
>    Status S;
> +  std::string RealName;
>    friend class RealFileSystem;
> -  RealFile(int FD, StringRef NewName)
> +  RealFile(int FD, StringRef NewName, StringRef NewRealPathName)
>        : FD(FD), S(NewName, {}, {}, {}, {}, {},
> -                  llvm::sys::fs::file_type::status_error, {}) {
> +                  llvm::sys::fs::file_type::status_error, {}),
> +        RealName(NewRealPathName.str()) {
>      assert(FD >= 0 && "Invalid or inactive file descriptor");
>    }
>
>  public:
>    ~RealFile() override;
>    ErrorOr<Status> status() override;
> +  ErrorOr<StringRef> getName() override;
>    ErrorOr<std::unique_ptr<MemoryBuffer>> getBuffer(const Twine &Name,
>                                                     int64_t FileSize,
>                                                     bool
> RequiresNullTerminator,
> @@ -170,6 +173,10 @@ ErrorOr<Status> RealFile::status() {
>    return S;
>  }
>
> +ErrorOr<StringRef> RealFile::getName() {
> +  return RealName.empty() ? S.getName() : StringRef(RealName);
> +}
> +
>  ErrorOr<std::unique_ptr<MemoryBuffer>>
>  RealFile::getBuffer(const Twine &Name, int64_t FileSize,
>                      bool RequiresNullTerminator, bool IsVolatile) {
> @@ -207,9 +214,10 @@ ErrorOr<Status> RealFileSystem::status(c
>  ErrorOr<std::unique_ptr<File>>
>  RealFileSystem::openFileForRead(const Twine &Name) {
>    int FD;
> -  if (std::error_code EC = sys::fs::openFileForRead(Name, FD))
> +  SmallString<256> RealName;
> +  if (std::error_code EC = sys::fs::openFileForRead(Name, FD, &RealName))
>      return EC;
> -  return std::unique_ptr<File>(new RealFile(FD, Name.str()));
> +  return std::unique_ptr<File>(new RealFile(FD, Name.str(),
> RealName.str()));
>  }
>
>  llvm::ErrorOr<std::string> RealFileSystem::getCurrentWorkingDirectory()
> const {
>
> Modified: cfe/trunk/lib/Lex/HeaderSearch.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/HeaderSearch.cpp?rev=271708&r1=271707&r2=271708&view=diff
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_Lex_HeaderSearch.cpp-3Frev-3D271708-26r1-3D271707-26r2-3D271708-26view-3Ddiff&d=CwMFaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=t4UJXwtMcIwGvgOaMqGzrQ&m=V9o7pyPA6lC6C5vc83jcUDQl3QUmGLtRDdBUFqIUYc8&s=Ebfh0dwdshHLbsMt1HqZVk5saVnTh-AS727v_ebK6XM&e=>
>
> ==============================================================================
> --- cfe/trunk/lib/Lex/HeaderSearch.cpp (original)
> +++ cfe/trunk/lib/Lex/HeaderSearch.cpp Fri Jun  3 13:52:51 2016
> @@ -250,8 +250,9 @@ const char *DirectoryLookup::getName() c
>  }
>
>  const FileEntry *HeaderSearch::getFileAndSuggestModule(
> -    StringRef FileName, const DirectoryEntry *Dir, bool IsSystemHeaderDir,
> -    Module *RequestingModule, ModuleMap::KnownHeader *SuggestedModule) {
> +    StringRef FileName, SourceLocation IncludeLoc, const DirectoryEntry
> *Dir,
> +    bool IsSystemHeaderDir, Module *RequestingModule,
> +    ModuleMap::KnownHeader *SuggestedModule) {
>    // If we have a module map that might map this header, load it and
>    // check whether we'll have a suggestion for a module.
>    const FileEntry *File = getFileMgr().getFile(FileName,
> /*OpenFile=*/true);
> @@ -272,6 +273,7 @@ const FileEntry *HeaderSearch::getFileAn
>  const FileEntry *DirectoryLookup::LookupFile(
>      StringRef &Filename,
>      HeaderSearch &HS,
> +    SourceLocation IncludeLoc,
>      SmallVectorImpl<char> *SearchPath,
>      SmallVectorImpl<char> *RelativePath,
>      Module *RequestingModule,
> @@ -297,7 +299,7 @@ const FileEntry *DirectoryLookup::Lookup
>        RelativePath->append(Filename.begin(), Filename.end());
>      }
>
> -    return HS.getFileAndSuggestModule(TmpDir, getDir(),
> +    return HS.getFileAndSuggestModule(TmpDir, IncludeLoc, getDir(),
>                                        isSystemHeaderDirectory(),
>                                        RequestingModule, SuggestedModule);
>    }
> @@ -585,7 +587,7 @@ const FileEntry *HeaderSearch::LookupFil
>        RelativePath->append(Filename.begin(), Filename.end());
>      }
>      // Otherwise, just return the file.
> -    return getFileAndSuggestModule(Filename, nullptr,
> +    return getFileAndSuggestModule(Filename, IncludeLoc, nullptr,
>                                     /*IsSystemHeaderDir*/false,
>                                     RequestingModule, SuggestedModule);
>    }
> @@ -622,7 +624,7 @@ const FileEntry *HeaderSearch::LookupFil
>            Includer ? getFileInfo(Includer).DirInfo != SrcMgr::C_User :
>            BuildSystemModule;
>        if (const FileEntry *FE = getFileAndSuggestModule(
> -              TmpDir, IncluderAndDir.second, IncluderIsSystemHeader,
> +              TmpDir, IncludeLoc, IncluderAndDir.second,
> IncluderIsSystemHeader,
>                RequestingModule, SuggestedModule)) {
>          if (!Includer) {
>            assert(First && "only first includer can have no file");
> @@ -713,7 +715,7 @@ const FileEntry *HeaderSearch::LookupFil
>      bool InUserSpecifiedSystemFramework = false;
>      bool HasBeenMapped = false;
>      const FileEntry *FE = SearchDirs[i].LookupFile(
> -        Filename, *this, SearchPath, RelativePath, RequestingModule,
> +        Filename, *this, IncludeLoc, SearchPath, RelativePath,
> RequestingModule,
>          SuggestedModule, InUserSpecifiedSystemFramework, HasBeenMapped,
>          MappedName);
>      if (HasBeenMapped) {
>
> Modified: cfe/trunk/lib/Lex/PPDirectives.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPDirectives.cpp?rev=271708&r1=271707&r2=271708&view=diff
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_Lex_PPDirectives.cpp-3Frev-3D271708-26r1-3D271707-26r2-3D271708-26view-3Ddiff&d=CwMFaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=t4UJXwtMcIwGvgOaMqGzrQ&m=V9o7pyPA6lC6C5vc83jcUDQl3QUmGLtRDdBUFqIUYc8&s=QugiHYCfviRQxQQK9-OYyM-uAYKWoLlIRPACGkNGdgw&e=>
>
> ==============================================================================
> --- cfe/trunk/lib/Lex/PPDirectives.cpp (original)
> +++ cfe/trunk/lib/Lex/PPDirectives.cpp Fri Jun  3 13:52:51 2016
> @@ -24,6 +24,9 @@
>  #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"
> @@ -1556,6 +1559,41 @@ 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
> @@ -1720,6 +1758,35 @@ void Preprocessor::HandleIncludeDirectiv
>      }
>    }
>
> +  // 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
>
> Added: cfe/trunk/test/Lexer/Inputs/case-insensitive-include.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Lexer/Inputs/case-insensitive-include.h?rev=271708&view=auto
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_test_Lexer_Inputs_case-2Dinsensitive-2Dinclude.h-3Frev-3D271708-26view-3Dauto&d=CwMFaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=t4UJXwtMcIwGvgOaMqGzrQ&m=V9o7pyPA6lC6C5vc83jcUDQl3QUmGLtRDdBUFqIUYc8&s=2DKea-gWyg2aHxljrbglHueVSS4-04lPDK8kBb8X8DA&e=>
>
> ==============================================================================
> --- cfe/trunk/test/Lexer/Inputs/case-insensitive-include.h (added)
> +++ cfe/trunk/test/Lexer/Inputs/case-insensitive-include.h Fri Jun  3
> 13:52:51 2016
> @@ -0,0 +1,5 @@
> +#pragma once
> +
> +struct S {
> +  int x;
> +};
>
> Added: cfe/trunk/test/Lexer/case-insensitive-include-ms.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Lexer/case-insensitive-include-ms.c?rev=271708&view=auto
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_test_Lexer_case-2Dinsensitive-2Dinclude-2Dms.c-3Frev-3D271708-26view-3Dauto&d=CwMFaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=t4UJXwtMcIwGvgOaMqGzrQ&m=V9o7pyPA6lC6C5vc83jcUDQl3QUmGLtRDdBUFqIUYc8&s=6rz4E7m8nEg_815olqcu_2xAoXuw-FzLzh8IUuRZmQs&e=>
>
> ==============================================================================
> --- cfe/trunk/test/Lexer/case-insensitive-include-ms.c (added)
> +++ cfe/trunk/test/Lexer/case-insensitive-include-ms.c Fri Jun  3 13:52:51
> 2016
> @@ -0,0 +1,18 @@
> +// REQUIRES: case-insensitive-filesystem
> +
> +// RUN: mkdir -p %T/apath
> +// RUN: cp %S/Inputs/case-insensitive-include.h %T
> +// RUN: cd %T
> +// RUN: %clang_cc1 -fsyntax-only -fms-compatibility %s -include %s -I %T
> -verify
> +// RUN: %clang_cc1 -fsyntax-only -fms-compatibility
> -fdiagnostics-parseable-fixits %s -include %s -I %T 2>&1 | FileCheck %s
> +
> +#include "..\Output\.\case-insensitive-include.h"
> +#include "..\Output\.\Case-Insensitive-Include.h" // expected-warning
> {{non-portable path}}
> +// CHECK:
> fix-it:"{{.*}}":{[[@LINE-1]]:10-[[@LINE-1]]:50}:"\"..\\Output\\.\\case-insensitive-include.h\""
> +#include "..\output\.\case-insensitive-include.h" // expected-warning
> {{non-portable path}}
> +// CHECK:
> fix-it:"{{.*}}":{[[@LINE-1]]:10-[[@LINE-1]]:50}:"\"..\\Output\\.\\case-insensitive-include.h\""
> +
> +#include "apath\..\.\case-insensitive-include.h"
> +#include "apath\..\.\Case-Insensitive-Include.h" // expected-warning
> {{non-portable path}}
> +// CHECK:
> fix-it:"{{.*}}":{[[@LINE-1]]:10-[[@LINE-1]]:49}:"\"apath\\..\\.\\case-insensitive-include.h\""
> +#include "APath\..\.\case-insensitive-include.h" // For the sake of
> efficiency, this case is not diagnosed. :-(
>
> Added: cfe/trunk/test/Lexer/case-insensitive-include.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Lexer/case-insensitive-include.c?rev=271708&view=auto
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_test_Lexer_case-2Dinsensitive-2Dinclude.c-3Frev-3D271708-26view-3Dauto&d=CwMFaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=t4UJXwtMcIwGvgOaMqGzrQ&m=V9o7pyPA6lC6C5vc83jcUDQl3QUmGLtRDdBUFqIUYc8&s=1tbn86CAD1kee5FFWpAkjbAHeh-otH2u6AujIat6wZI&e=>
>
> ==============================================================================
> --- cfe/trunk/test/Lexer/case-insensitive-include.c (added)
> +++ cfe/trunk/test/Lexer/case-insensitive-include.c Fri Jun  3 13:52:51
> 2016
> @@ -0,0 +1,27 @@
> +// REQUIRES: case-insensitive-filesystem
> +
> +// RUN: mkdir -p %T/apath
> +// RUN: cp %S/Inputs/case-insensitive-include.h %T
> +// RUN: cd %T
> +// RUN: %clang_cc1 -fsyntax-only %s -include %s -I %T -verify
> +// RUN: %clang_cc1 -fsyntax-only -fdiagnostics-parseable-fixits %s
> -include %s -I %T 2>&1 | FileCheck %s
> +
> +#include "case-insensitive-include.h"
> +#include "Case-Insensitive-Include.h" // expected-warning {{non-portable
> path}}
> +// CHECK:
> fix-it:"{{.*}}":{[[@LINE-1]]:10-[[@LINE-1]]:38}:"\"case-insensitive-include.h\""
> +
> +#include "../Output/./case-insensitive-include.h"
> +#include "../Output/./Case-Insensitive-Include.h" // expected-warning
> {{non-portable path}}
> +// CHECK:
> fix-it:"{{.*}}":{[[@LINE-1]]:10-[[@LINE-1]]:50}:"\"../Output/./case-insensitive-include.h\""
> +#include "../output/./case-insensitive-include.h" // expected-warning
> {{non-portable path}}
> +// CHECK:
> fix-it:"{{.*}}":{[[@LINE-1]]:10-[[@LINE-1]]:50}:"\"../Output/./case-insensitive-include.h\""
> +
> +#include "apath/.././case-insensitive-include.h"
> +#include "apath/.././Case-Insensitive-Include.h" // expected-warning
> {{non-portable path}}
> +// CHECK:
> fix-it:"{{.*}}":{[[@LINE-1]]:10-[[@LINE-1]]:49}:"\"apath/.././case-insensitive-include.h\""
> +#include "APath/.././case-insensitive-include.h" // For the sake of
> efficiency, this case is not diagnosed. :-(
> +
> +#include "../Output/./apath/.././case-insensitive-include.h"
> +#include "../Output/./APath/.././case-insensitive-include.h" // For the
> sake of efficiency, this case is not diagnosed. :-(
> +#include "../output/./apath/.././case-insensitive-include.h" //
> expected-warning {{non-portable path}}
> +// CHECK:
> fix-it:"{{.*}}":{[[@LINE-1]]:10-[[@LINE-1]]:61}:"\"../Output/./apath/.././case-insensitive-include.h\""
>
> Modified: cfe/trunk/test/PCH/case-insensitive-include.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/case-insensitive-include.c?rev=271708&r1=271707&r2=271708&view=diff
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_test_PCH_case-2Dinsensitive-2Dinclude.c-3Frev-3D271708-26r1-3D271707-26r2-3D271708-26view-3Ddiff&d=CwMFaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=t4UJXwtMcIwGvgOaMqGzrQ&m=V9o7pyPA6lC6C5vc83jcUDQl3QUmGLtRDdBUFqIUYc8&s=zVaRhVtq7ZHNV3H0vfd_1vOF7-vjRQeHnRyU419K7IE&e=>
>
> ==============================================================================
> --- cfe/trunk/test/PCH/case-insensitive-include.c (original)
> +++ cfe/trunk/test/PCH/case-insensitive-include.c Fri Jun  3 13:52:51 2016
> @@ -2,7 +2,7 @@
>
>  // Test this without pch.
>  // RUN: cp %S/Inputs/case-insensitive-include.h %T
> -// RUN: %clang_cc1 -fsyntax-only %s -include %s -I %T -verify
> +// RUN: %clang_cc1 -Wno-nonportable-include-path -fsyntax-only %s
> -include %s -I %T -verify
>
>  // Test with pch.
>  // RUN: %clang_cc1 -emit-pch -o %t.pch %s -I %T
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
> <https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.llvm.org_cgi-2Dbin_mailman_listinfo_cfe-2Dcommits&d=CwMFaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=t4UJXwtMcIwGvgOaMqGzrQ&m=V9o7pyPA6lC6C5vc83jcUDQl3QUmGLtRDdBUFqIUYc8&s=vEbwZjtEM_C4qGMaZuAZ2bGrAqRPN-kA24CpR350-_s&e=>
>
>
>
>
>
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160603/af7e3999/attachment-0001.html>


More information about the cfe-commits mailing list