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 14:46:38 PDT 2016
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
>> 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
>> Corresponding LLVM change: http://reviews.llvm.org/D19842
>>
>> 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
>>
>> ==============================================================================
>> --- 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
>>
>> ==============================================================================
>> --- 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
>>
>> ==============================================================================
>> --- 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
>>
>> ==============================================================================
>> --- 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
>>
>> ==============================================================================
>> --- 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
>>
>> ==============================================================================
>> --- 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
>>
>> ==============================================================================
>> --- 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
>>
>> ==============================================================================
>> --- 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
>>
>> ==============================================================================
>> --- 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
>>
>> ==============================================================================
>> --- 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
>>
>> ==============================================================================
>> --- 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
>>
>> ==============================================================================
>> --- 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
>>
>> ==============================================================================
>> --- 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
>>
>> ==============================================================================
>> --- 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
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160603/6a23177b/attachment-0001.html>
More information about the cfe-commits
mailing list