sammccall created this revision. sammccall added a reviewer: kadircet. Herald added a subscriber: arphaman. Herald added a reviewer: njames93. Herald added a project: All. sammccall requested review of this revision. Herald added subscribers: cfe-commits, MaskRay, ilya-biryukov. Herald added a project: clang-tools-extra.
This aligns with the default behavior of clang-tidy (which we offer no way to override). Fixes https://github.com/clangd/clangd/issues/1448 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D141495 Files: clang-tools-extra/clangd/ParsedAST.cpp clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp Index: clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp +++ 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() { Index: clang-tools-extra/clangd/ParsedAST.cpp =================================================================== --- clang-tools-extra/clangd/ParsedAST.cpp +++ 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 &&
Index: clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp +++ 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() { Index: clang-tools-extra/clangd/ParsedAST.cpp =================================================================== --- clang-tools-extra/clangd/ParsedAST.cpp +++ 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 &&
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits