diff --git a/clang-tools-extra/clangd/ParsedAST.cpp b/clang-tools-extra/clangd/ParsedAST.cpp --- a/clang-tools-extra/clangd/ParsedAST.cpp +++ b/clang-tools-extra/clangd/ParsedAST.cpp @@ -11,7 +11,6 @@ #include "../clang-tidy/ClangTidyDiagnosticConsumer.h" #include "../clang-tidy/ClangTidyModuleRegistry.h" #include "AST.h" -#include "ASTSignals.h" #include "Compiler.h" #include "Config.h" #include "Diagnostics.h" @@ -543,6 +542,10 @@ // NOLINT comments)? return DiagnosticsEngine::Ignored; } + // Match behavior for clang-tidy --system-headers=0 (the default). + if (Info.hasSourceManager() && + Info.getSourceManager().isInSystemMacro(Info.getLocation())) + return DiagnosticsEngine::Ignored; // Check for warning-as-error. if (DiagLevel == DiagnosticsEngine::Warning && diff --git a/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp b/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp --- a/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp +++ b/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp @@ -527,6 +527,37 @@ diagName("bugprone-integer-division"))))); } +TEST(DiagnosticTest, ClangTidySystemMacro) { + Annotations Main(R"cpp( + #include "user.h" + #include "system.h" + int i = 3; + double x = $inline[[8]] / i; + double y = $user[[DIVIDE_USER]](i); + double z = DIVIDE_SYS(i); + )cpp"); + + auto TU = TestTU::withCode(Main.code()); + TU.AdditionalFiles["user.h"] = R"cpp( + #define DIVIDE_USER(Y) 8/Y + )cpp"; + TU.AdditionalFiles["system.h"] = R"cpp( + #pragma clang system_header + #define DIVIDE_SYS(Y) 8/Y + )cpp"; + + TU.ClangTidyProvider = addTidyChecks("bugprone-integer-division"); + std::string BadDivision = "result of integer division used in a floating " + "point context; possible loss of precision"; + + // Expect to see warning from user macros, but not system macros. + // This matches clang-tidy --system-headers=0 (the default). + EXPECT_THAT(*TU.build().getDiagnostics(), + ifTidyChecks( + UnorderedElementsAre(Diag(Main.range("inline"), BadDivision), + Diag(Main.range("user"), BadDivision)))); +} + TEST(DiagnosticTest, ClangTidyWarningAsError) { Annotations Main(R"cpp( int main() {