From: Sam McCall Date: Wed, 11 Jan 2023 14:46:03 +0000 (+0100) Subject: [clangd] Suppress clang-tidy warnings for code spelled in system macros X-Git-Tag: upstream/17.0.6~21378 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f0e60f99aefff66ca6223eb3c3a36615f36454ec;p=platform%2Fupstream%2Fllvm.git [clangd] Suppress clang-tidy warnings for code spelled in system macros This aligns with the default behavior of clang-tidy (which we offer no way to override). Fixes https://github.com/clangd/clangd/issues/1448 Differential Revision: https://reviews.llvm.org/D141495 --- diff --git a/clang-tools-extra/clangd/ParsedAST.cpp b/clang-tools-extra/clangd/ParsedAST.cpp index b8dd161..637cada 100644 --- 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 @@ ParsedAST::build(llvm::StringRef Filename, const ParseInputs &Inputs, // 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 index 7310a11..824756a 100644 --- a/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp +++ b/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp @@ -527,6 +527,37 @@ TEST(DiagnosticTest, ClangTidySuppressionComment) { 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() {