}
}
+// FIXME(kirillbobyrev): We currently do not support the umbrella headers.
+// Standard Library headers are typically umbrella headers, and system headers
+// are likely to be the Standard Library headers. Until we have a good support
+// for umbrella headers and Standard Library headers, don't warn about them.
+bool mayConsiderUnused(const Inclusion *Inc) {
+ return Inc->Written.front() != '<';
+}
+
} // namespace
ReferencedLocations findReferencedLocations(ParsedAST &AST) {
->getName()
.str();
for (const auto *Inc : computeUnusedIncludes(AST)) {
+ if (!mayConsiderUnused(Inc))
+ continue;
Diag D;
D.Message =
llvm::formatv("included header {0} is not used",
TEST(DiagnosticsTest, IncludeCleaner) {
Annotations Test(R"cpp(
$fix[[ $diag[[#include "unused.h"]]
-]] #include "used.h"
+]]#include "used.h"
+
+ #include <system_header.h>
void foo() {
used();
TU.AdditionalFiles["used.h"] = R"cpp(
void used() {}
)cpp";
+ TU.AdditionalFiles["system/system_header.h"] = "";
+ TU.ExtraArgs = {"-isystem" + testPath("system")};
// Off by default.
EXPECT_THAT(*TU.build().getDiagnostics(), IsEmpty());
Config Cfg;
#include "dir/c.h"
#include "dir/unused.h"
#include "unused.h"
+ #include <system_header.h>
void foo() {
a();
b();
TU.AdditionalFiles["dir/c.h"] = "void c();";
TU.AdditionalFiles["unused.h"] = "void unused();";
TU.AdditionalFiles["dir/unused.h"] = "void dirUnused();";
- TU.AdditionalFiles["not_included.h"] = "void notIncluded();";
- TU.ExtraArgs = {"-I" + testPath("dir")};
+ TU.AdditionalFiles["system/system_header.h"] = "";
+ TU.ExtraArgs.push_back("-I" + testPath("dir"));
+ TU.ExtraArgs.push_back("-isystem" + testPath("system"));
TU.Code = MainFile.str();
ParsedAST AST = TU.build();
- auto UnusedIncludes = computeUnusedIncludes(AST);
- std::vector<std::string> UnusedHeaders;
- UnusedHeaders.reserve(UnusedIncludes.size());
- for (const auto &Include : UnusedIncludes)
- UnusedHeaders.push_back(Include->Written);
- EXPECT_THAT(UnusedHeaders,
- UnorderedElementsAre("\"unused.h\"", "\"dir/unused.h\""));
+ std::vector<std::string> UnusedIncludes;
+ for (const auto &Include : computeUnusedIncludes(AST))
+ UnusedIncludes.push_back(Include->Written);
+ EXPECT_THAT(UnusedIncludes,
+ UnorderedElementsAre("\"unused.h\"", "\"dir/unused.h\"",
+ "<system_header.h>"));
}
TEST(IncludeCleaner, ScratchBuffer) {