[PATCH] Fix false positives in -Wmsvc-include by continuing header search
Reid Kleckner
rnk at google.com
Mon Feb 10 17:29:15 PST 2014
Hi rsmith,
This makes Clang and LLVM -Wmsvc-include clean.
I believe the correct behavior here is to avoid updating the cache when
we find the header via MSVC's search rules.
http://llvm-reviews.chandlerc.com/D2733
Files:
lib/Lex/HeaderSearch.cpp
Index: lib/Lex/HeaderSearch.cpp
===================================================================
--- lib/Lex/HeaderSearch.cpp
+++ lib/Lex/HeaderSearch.cpp
@@ -489,6 +489,17 @@
// Header File Location.
//===----------------------------------------------------------------------===//
+/// \brief Return true with a diagnostic if the file that MSVC would have found
+/// fails to match the one that Clang would have found with MSVC header search
+/// disabled.
+bool checkMSVCHeaderSearch(DiagnosticsEngine &Diags, const FileEntry *MSFE,
+ const FileEntry *FE, SourceLocation IncludeLoc) {
+ if (MSFE && FE != MSFE) {
+ Diags.Report(IncludeLoc, diag::ext_pp_include_search_ms) << MSFE->getName();
+ return true;
+ }
+ return false;
+}
/// LookupFile - Given a "foo" or \<foo> reference, look up the indicated file,
/// return null on failure. isAngled indicates whether the file reference is
@@ -539,15 +550,18 @@
return FileMgr.getFile(Filename, /*openFile=*/true);
}
+ // This is the header that MSVC's header search would have found.
+ const FileEntry *MSFE = 0;
+
// Unless disabled, check to see if the file is in the #includer's
// directory. This cannot be based on CurDir, because each includer could be
// a #include of a subdirectory (#include "foo/bar.h") and a subsequent
// include of "baz.h" should resolve to "whatever/foo/baz.h".
// This search is not done for <> headers.
if (!Includers.empty() && !isAngled && !NoCurDirSearch) {
SmallString<1024> TmpDir;
- for (ArrayRef<const FileEntry *>::iterator I(Includers.begin()),
- E(Includers.end());
+ for (ArrayRef<const FileEntry *>::iterator I = Includers.begin(),
+ E = Includers.end();
I != E; ++I) {
const FileEntry *Includer = *I;
// Concatenate the requested file onto the directory.
@@ -582,10 +596,20 @@
RelativePath->clear();
RelativePath->append(Filename.begin(), Filename.end());
}
- if (I != Includers.begin())
- Diags.Report(IncludeLoc, diag::ext_pp_include_search_ms)
- << FE->getName();
- return FE;
+ if (I == Includers.begin())
+ return FE;
+
+ // Otherwise, we found the path via MSVC header search rules. If
+ // -Wmsvc-include is enabled, we have to keep searching to see if we
+ // would've found this header in -I or -isystem directories.
+ if (Diags.getDiagnosticLevel(diag::ext_pp_include_search_ms,
+ IncludeLoc) ==
+ DiagnosticsEngine::Ignored) {
+ MSFE = FE;
+ break;
+ } else {
+ return FE;
+ }
}
}
}
@@ -660,7 +684,10 @@
SlashPos));
}
}
-
+
+ if (checkMSVCHeaderSearch(Diags, MSFE, FE, IncludeLoc))
+ return MSFE;
+
// Remember this location for the next lookup we do.
CacheLookup.second = i;
return FE;
@@ -679,17 +706,24 @@
ScratchFilename += '/';
ScratchFilename += Filename;
- const FileEntry *Result = LookupFile(
+ const FileEntry *FE = LookupFile(
ScratchFilename, IncludeLoc, /*isAngled=*/true, FromDir, CurDir,
Includers.front(), SearchPath, RelativePath, SuggestedModule);
+
+ if (checkMSVCHeaderSearch(Diags, MSFE, FE, IncludeLoc))
+ return MSFE;
+
std::pair<unsigned, unsigned> &CacheLookup
= LookupFileCache.GetOrCreateValue(Filename).getValue();
CacheLookup.second
= LookupFileCache.GetOrCreateValue(ScratchFilename).getValue().second;
- return Result;
+ return FE;
}
}
+ if (checkMSVCHeaderSearch(Diags, MSFE, 0, IncludeLoc))
+ return MSFE;
+
// Otherwise, didn't find it. Remember we didn't find this.
CacheLookup.second = SearchDirs.size();
return 0;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D2733.1.patch
Type: text/x-patch
Size: 3963 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140210/714f0f5c/attachment.bin>
More information about the cfe-commits
mailing list