@@ -68,24 +68,30 @@ bool isIgnored(llvm::StringRef HeaderPath, HeaderFilter IgnoreHeaders) {
6868}
6969
7070bool mayConsiderUnused (const Inclusion &Inc, ParsedAST &AST,
71- const include_cleaner::PragmaIncludes *PI) {
71+ const include_cleaner::PragmaIncludes *PI,
72+ bool AnalyzeAngledIncludes) {
7273 assert (Inc.HeaderID );
7374 auto HID = static_cast <IncludeStructure::HeaderID>(*Inc.HeaderID );
7475 auto FE = AST.getSourceManager ().getFileManager ().getFileRef (
7576 AST.getIncludeStructure ().getRealPath (HID));
7677 assert (FE);
7778 if (FE->getDir () == AST.getPreprocessor ()
78- .getHeaderSearchInfo ()
79- .getModuleMap ()
80- .getBuiltinDir ())
79+ .getHeaderSearchInfo ()
80+ .getModuleMap ()
81+ .getBuiltinDir ())
8182 return false ;
8283 if (PI && PI->shouldKeep (*FE))
8384 return false ;
8485 // FIXME(kirillbobyrev): We currently do not support the umbrella headers.
8586 // System headers are likely to be standard library headers.
86- // Until we have good support for umbrella headers, don't warn about them.
87- if (Inc.Written .front () == ' <' )
88- return tooling::stdlib::Header::named (Inc.Written ).has_value ();
87+ // Until we have good support for umbrella headers, don't warn about them
88+ // (unless analysis is explicitly enabled).
89+ if (Inc.Written .front () == ' <' ) {
90+ if (tooling::stdlib::Header::named (Inc.Written ))
91+ return true ;
92+ if (!AnalyzeAngledIncludes)
93+ return false ;
94+ }
8995 if (PI) {
9096 // Check if main file is the public interface for a private header. If so we
9197 // shouldn't diagnose it as unused.
@@ -266,7 +272,8 @@ Fix fixAll(const Fix &RemoveAllUnused, const Fix &AddAllMissing) {
266272
267273std::vector<const Inclusion *>
268274getUnused (ParsedAST &AST,
269- const llvm::DenseSet<IncludeStructure::HeaderID> &ReferencedFiles) {
275+ const llvm::DenseSet<IncludeStructure::HeaderID> &ReferencedFiles,
276+ bool AnalyzeAngledIncludes) {
270277 trace::Span Tracer (" IncludeCleaner::getUnused" );
271278 std::vector<const Inclusion *> Unused;
272279 for (const Inclusion &MFI : AST.getIncludeStructure ().MainFileIncludes ) {
@@ -275,7 +282,8 @@ getUnused(ParsedAST &AST,
275282 auto IncludeID = static_cast <IncludeStructure::HeaderID>(*MFI.HeaderID );
276283 if (ReferencedFiles.contains (IncludeID))
277284 continue ;
278- if (!mayConsiderUnused (MFI, AST, &AST.getPragmaIncludes ())) {
285+ if (!mayConsiderUnused (MFI, AST, &AST.getPragmaIncludes (),
286+ AnalyzeAngledIncludes)) {
279287 dlog (" {0} was not used, but is not eligible to be diagnosed as unused" ,
280288 MFI.Written );
281289 continue ;
@@ -347,7 +355,8 @@ include_cleaner::Includes convertIncludes(const ParsedAST &AST) {
347355 return ConvertedIncludes;
348356}
349357
350- IncludeCleanerFindings computeIncludeCleanerFindings (ParsedAST &AST) {
358+ IncludeCleanerFindings
359+ computeIncludeCleanerFindings (ParsedAST &AST, bool AnalyzeAngledIncludes) {
351360 // Interaction is only polished for C/CPP.
352361 if (AST.getLangOpts ().ObjC )
353362 return {};
@@ -432,7 +441,8 @@ IncludeCleanerFindings computeIncludeCleanerFindings(ParsedAST &AST) {
432441 MapInfo::getHashValue (RHS.Symbol );
433442 });
434443 MissingIncludes.erase (llvm::unique (MissingIncludes), MissingIncludes.end ());
435- std::vector<const Inclusion *> UnusedIncludes = getUnused (AST, Used);
444+ std::vector<const Inclusion *> UnusedIncludes =
445+ getUnused (AST, Used, AnalyzeAngledIncludes);
436446 return {std::move (UnusedIncludes), std::move (MissingIncludes)};
437447}
438448
0 commit comments