diff --git a/clang-tools-extra/include-cleaner/lib/WalkAST.cpp b/clang-tools-extra/include-cleaner/lib/WalkAST.cpp index 0db1f2bec8e6b..b10c722b6653a 100644 --- a/clang-tools-extra/include-cleaner/lib/WalkAST.cpp +++ b/clang-tools-extra/include-cleaner/lib/WalkAST.cpp @@ -17,6 +17,7 @@ #include "clang/AST/TemplateName.h" #include "clang/AST/Type.h" #include "clang/AST/TypeLoc.h" +#include "clang/Basic/IdentifierTable.h" #include "clang/Basic/SourceLocation.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/STLFunctionalExtras.h" @@ -34,6 +35,9 @@ class ASTWalker : public RecursiveASTVisitor { RefType RT = RefType::Explicit) { if (!ND || Loc.isInvalid()) return; + // Don't report builtin symbols. + if (const auto *II = ND->getIdentifier(); II && II->getBuiltinID() > 0) + return; Callback(Loc, *cast(ND->getCanonicalDecl()), RT); } diff --git a/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp b/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp index 8ce556f5fbf1f..fd6c6da9d5509 100644 --- a/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp +++ b/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp @@ -322,5 +322,11 @@ TEST(WalkAST, Enums) { testWalk("enum class E : int {};", "enum class ^E : int ;"); } +TEST(WalkAST, BuiltinSymbols) { + testWalk(R"cpp( + extern "C" int __builtin_popcount(unsigned int) noexcept; + )cpp", "int x = ^__builtin_popcount(1);"); +} + } // namespace } // namespace clang::include_cleaner