https://github.com/jpienaar updated https://github.com/llvm/llvm-project/pull/149148
>From b404f5390ac5684c7452e69f6fe209e5215f8929 Mon Sep 17 00:00:00 2001 From: Jacques Pienaar <jpien...@google.com> Date: Wed, 16 Jul 2025 17:37:53 +0000 Subject: [PATCH 1/7] [clang-tidy] Add MLIR check for old op builder usage. Moving towards new create method invocation, add check to flag old usage. --- clang-tools-extra/clang-tidy/CMakeLists.txt | 2 + .../clang-tidy/ClangTidyForceLinker.h | 5 + .../clang-tidy/mlir/CMakeLists.txt | 28 +++++ .../clang-tidy/mlir/MLIRTidyModule.cpp | 39 +++++++ .../clang-tidy/mlir/OpBuilderCheck.cpp | 102 ++++++++++++++++++ .../clang-tidy/mlir/OpBuilderCheck.h | 21 ++++ clang-tools-extra/docs/ReleaseNotes.rst | 5 + .../docs/clang-tidy/checks/list.rst | 2 + .../clang-tidy/checks/mlir/op-builder.rst | 22 ++++ .../clang-tidy/checkers/mlir/op_builder.cpp | 51 +++++++++ 10 files changed, 277 insertions(+) create mode 100644 clang-tools-extra/clang-tidy/mlir/CMakeLists.txt create mode 100644 clang-tools-extra/clang-tidy/mlir/MLIRTidyModule.cpp create mode 100644 clang-tools-extra/clang-tidy/mlir/OpBuilderCheck.cpp create mode 100644 clang-tools-extra/clang-tidy/mlir/OpBuilderCheck.h create mode 100644 clang-tools-extra/docs/clang-tidy/checks/mlir/op-builder.rst create mode 100644 clang-tools-extra/test/clang-tidy/checkers/mlir/op_builder.cpp diff --git a/clang-tools-extra/clang-tidy/CMakeLists.txt b/clang-tools-extra/clang-tidy/CMakeLists.txt index 93117cf1d6373..b89003bf6c926 100644 --- a/clang-tools-extra/clang-tidy/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/CMakeLists.txt @@ -66,6 +66,7 @@ add_subdirectory(linuxkernel) add_subdirectory(llvm) add_subdirectory(llvmlibc) add_subdirectory(misc) +add_subdirectory(mlir) add_subdirectory(modernize) if(CLANG_TIDY_ENABLE_STATIC_ANALYZER) add_subdirectory(mpi) @@ -93,6 +94,7 @@ set(ALL_CLANG_TIDY_CHECKS clangTidyLLVMModule clangTidyLLVMLibcModule clangTidyMiscModule + clangTidyMLIRModule clangTidyModernizeModule clangTidyObjCModule clangTidyOpenMPModule diff --git a/clang-tools-extra/clang-tidy/ClangTidyForceLinker.h b/clang-tools-extra/clang-tidy/ClangTidyForceLinker.h index adde9136ff1dd..3cde93124c6e4 100644 --- a/clang-tools-extra/clang-tidy/ClangTidyForceLinker.h +++ b/clang-tools-extra/clang-tidy/ClangTidyForceLinker.h @@ -94,6 +94,11 @@ extern volatile int MiscModuleAnchorSource; static int LLVM_ATTRIBUTE_UNUSED MiscModuleAnchorDestination = MiscModuleAnchorSource; +// This anchor is used to force the linker to link the MLIRModule. +extern volatile int MLIRModuleAnchorSource; +static int LLVM_ATTRIBUTE_UNUSED MLIRModuleAnchorDestination = + MLIRModuleAnchorSource; + // This anchor is used to force the linker to link the ModernizeModule. extern volatile int ModernizeModuleAnchorSource; static int LLVM_ATTRIBUTE_UNUSED ModernizeModuleAnchorDestination = diff --git a/clang-tools-extra/clang-tidy/mlir/CMakeLists.txt b/clang-tools-extra/clang-tidy/mlir/CMakeLists.txt new file mode 100644 index 0000000000000..7d0b2de1df24c --- /dev/null +++ b/clang-tools-extra/clang-tidy/mlir/CMakeLists.txt @@ -0,0 +1,28 @@ +set(LLVM_LINK_COMPONENTS + FrontendOpenMP + Support + ) + +add_clang_library(clangTidyMLIRModule STATIC + MLIRTidyModule.cpp + OpBuilderCheck.cpp + + LINK_LIBS + clangTidy + clangTidyReadabilityModule + clangTidyUtils + clangTransformer + + DEPENDS + omp_gen + ClangDriverOptions + ) + +clang_target_link_libraries(clangTidyMLIRModule + PRIVATE + clangAST + clangASTMatchers + clangBasic + clangLex + clangTooling + ) diff --git a/clang-tools-extra/clang-tidy/mlir/MLIRTidyModule.cpp b/clang-tools-extra/clang-tidy/mlir/MLIRTidyModule.cpp new file mode 100644 index 0000000000000..f542020a0afdd --- /dev/null +++ b/clang-tools-extra/clang-tidy/mlir/MLIRTidyModule.cpp @@ -0,0 +1,39 @@ +//===--- MLIRTidyModule.cpp - clang-tidy ----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "../ClangTidy.h" +#include "../ClangTidyModule.h" +#include "../ClangTidyModuleRegistry.h" +#include "OpBuilderCheck.h" + +namespace clang::tidy { +namespace mlir_check { + +class MLIRModule : public ClangTidyModule { +public: + void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override { + CheckFactories.registerCheck<OpBuilderCheck>("mlir-op-builder"); + } + + ClangTidyOptions getModuleOptions() override { + ClangTidyOptions Options; + return Options; + } +}; + +// Register the ModuleModule using this statically initialized variable. +static ClangTidyModuleRegistry::Add<MLIRModule> X("mlir-module", + "Adds MLIR lint checks."); + +} // namespace mlir_check + +// This anchor is used to force the linker to link in the generated object file +// and thus register the MLIRModule. +volatile int MLIRModuleAnchorSource = 0; // NOLINT(misc-use-internal-linkage) + +} // namespace clang::tidy diff --git a/clang-tools-extra/clang-tidy/mlir/OpBuilderCheck.cpp b/clang-tools-extra/clang-tidy/mlir/OpBuilderCheck.cpp new file mode 100644 index 0000000000000..7521096d5b91d --- /dev/null +++ b/clang-tools-extra/clang-tidy/mlir/OpBuilderCheck.cpp @@ -0,0 +1,102 @@ +//===--- OpBuilderCheck.cpp - clang-tidy ----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "OpBuilderCheck.h" +#include "clang/ASTMatchers/ASTMatchers.h" +#include "clang/Basic/LLVM.h" +#include "clang/Lex/Lexer.h" +#include "clang/Tooling/Transformer/RangeSelector.h" +#include "clang/Tooling/Transformer/RewriteRule.h" +#include "clang/Tooling/Transformer/SourceCode.h" +#include "clang/Tooling/Transformer/Stencil.h" +#include "llvm/Support/Error.h" + +namespace clang::tidy::mlir_check { +namespace { + +using namespace ::clang::ast_matchers; // NOLINT: Too many names. +using namespace ::clang::transformer; // NOLINT: Too many names. + +class TypeAsWrittenStencil : public StencilInterface { +public: + explicit TypeAsWrittenStencil(std::string S) : id(std::move(S)) {} + std::string toString() const override { + return (llvm::Twine("TypeAsWritten(\"") + id + "\")").str(); + } + + llvm::Error eval(const MatchFinder::MatchResult &match, + std::string *result) const override { + auto n = node(id)(match); + if (!n) + return n.takeError(); + auto srcRange = n->getAsRange(); + if (srcRange.isInvalid()) { + return llvm::make_error<llvm::StringError>(llvm::errc::invalid_argument, + "srcRange is invalid"); + } + auto range = n->getTokenRange(srcRange); + auto nextToken = [&](std::optional<Token> token) { + if (!token) + return token; + return clang::Lexer::findNextToken(token->getLocation(), + *match.SourceManager, + match.Context->getLangOpts()); + }; + auto lessToken = clang::Lexer::findNextToken( + range.getBegin(), *match.SourceManager, match.Context->getLangOpts()); + while (lessToken && lessToken->getKind() != clang::tok::less) { + lessToken = nextToken(lessToken); + } + if (!lessToken) { + return llvm::make_error<llvm::StringError>(llvm::errc::invalid_argument, + "missing '<' token"); + } + std::optional<Token> endToken = nextToken(lessToken); + for (auto greaterToken = nextToken(endToken); + greaterToken && greaterToken->getKind() != clang::tok::greater; + greaterToken = nextToken(greaterToken)) { + endToken = greaterToken; + } + if (!endToken) { + return llvm::make_error<llvm::StringError>(llvm::errc::invalid_argument, + "missing '>' token"); + } + *result += clang::tooling::getText( + CharSourceRange::getTokenRange(lessToken->getEndLoc(), + endToken->getLastLoc()), + *match.Context); + return llvm::Error::success(); + } + std::string id; +}; + +Stencil typeAsWritten(StringRef Id) { + // Using this instead of `describe` so that we get the exact same spelling. + return std::make_shared<TypeAsWrittenStencil>(std::string(Id)); +} + +RewriteRuleWith<std::string> OpBuilderCheckRule() { + return makeRule( + cxxMemberCallExpr( + on(expr(hasType( + cxxRecordDecl(isSameOrDerivedFrom("::mlir::OpBuilder")))) + .bind("builder")), + callee(cxxMethodDecl(hasTemplateArgument(0, templateArgument()))), + callee(cxxMethodDecl(hasName("create")))) + .bind("call"), + changeTo(cat(typeAsWritten("call"), "::create(", node("builder"), ", ", + callArgs("call"), ")")), + cat("Use OpType::create(builder, ...) instead of " + "builder.create<OpType>(...)")); +} +} // namespace + +OpBuilderCheck::OpBuilderCheck(StringRef Name, ClangTidyContext *Context) + : TransformerClangTidyCheck(OpBuilderCheckRule(), Name, Context) {} + +} // namespace clang::tidy::mlir_check diff --git a/clang-tools-extra/clang-tidy/mlir/OpBuilderCheck.h b/clang-tools-extra/clang-tidy/mlir/OpBuilderCheck.h new file mode 100644 index 0000000000000..792ac7b782add --- /dev/null +++ b/clang-tools-extra/clang-tidy/mlir/OpBuilderCheck.h @@ -0,0 +1,21 @@ +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MLIR_OPBUILDERCHECK_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MLIR_OPBUILDERCHECK_H + +#include "../utils/TransformerClangTidyCheck.h" + +namespace clang::tidy::mlir_check { + +/// Checks for uses of `OpBuilder::create<T>` and suggests using `T::create` +/// instead. +class OpBuilderCheck : public utils::TransformerClangTidyCheck { +public: + OpBuilderCheck(StringRef Name, ClangTidyContext *Context); + + bool isLanguageVersionSupported(const LangOptions &LangOpts) const override { + return getLangOpts().CPlusPlus; + } +}; + +} // namespace clang::tidy::mlir_check + +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MLIR_OPBUILDERCHECK_H diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 07ebf8008928d..09cb793533837 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -96,6 +96,11 @@ Improvements to clang-tidy New checks ^^^^^^^^^^ +- New :doc:`mlir-op-builder + <clang-tidy/checks/mlir/op-builder>` check. + + Flags usage of old OpBuilder format. + New check aliases ^^^^^^^^^^^^^^^^^ diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst b/clang-tools-extra/docs/clang-tidy/checks/list.rst index 0cffbd323caa2..49cd008e7588c 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/list.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst @@ -24,6 +24,7 @@ Clang-Tidy Checks llvm/* llvmlibc/* misc/* + mlir/* modernize/* mpi/* objc/* @@ -279,6 +280,7 @@ Clang-Tidy Checks :doc:`misc-unused-using-decls <misc/unused-using-decls>`, "Yes" :doc:`misc-use-anonymous-namespace <misc/use-anonymous-namespace>`, :doc:`misc-use-internal-linkage <misc/use-internal-linkage>`, "Yes" + :doc:`mlir-op-builder <mlir/op-builder>`, "Yes" :doc:`modernize-avoid-bind <modernize/avoid-bind>`, "Yes" :doc:`modernize-avoid-c-arrays <modernize/avoid-c-arrays>`, :doc:`modernize-concat-nested-namespaces <modernize/concat-nested-namespaces>`, "Yes" diff --git a/clang-tools-extra/docs/clang-tidy/checks/mlir/op-builder.rst b/clang-tools-extra/docs/clang-tidy/checks/mlir/op-builder.rst new file mode 100644 index 0000000000000..30bae06a36836 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/mlir/op-builder.rst @@ -0,0 +1,22 @@ +.. title:: clang-tidy - mlir-op-builder + +mlir-op-builder +=============== + +Flags usage of old form of invoking create on `OpBuilder` and suggesting new +form. + +Example +------- + +.. code-block:: c++ + + builder.create<FooOp>(builder.getUnknownLoc(), "baz"); + + +Transforms to: + +.. code-block:: c++ + + FooOp::create(builder, builder.getUnknownLoc(), "baz"); + diff --git a/clang-tools-extra/test/clang-tidy/checkers/mlir/op_builder.cpp b/clang-tools-extra/test/clang-tidy/checkers/mlir/op_builder.cpp new file mode 100644 index 0000000000000..bf60c665e86ad --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/checkers/mlir/op_builder.cpp @@ -0,0 +1,51 @@ +// RUN: %check_clang_tidy --match-partial-fixes %s mlir-op-builder %t + +namespace mlir { +class Location {}; +class OpBuilder { +public: + template <typename OpTy, typename... Args> + OpTy create(Location location, Args &&...args) { + return OpTy(args...); + } + Location getUnknownLoc() { return Location(); } +}; +class ImplicitLocOpBuilder : public OpBuilder { +public: + template <typename OpTy, typename... Args> + OpTy create(Args &&...args) { + return OpTy(args...); + } +}; +struct ModuleOp { + ModuleOp() {} + static ModuleOp create(OpBuilder &builder, Location location) { + return ModuleOp(); + } +}; +struct NamedOp { + NamedOp(const char* name) {} + static NamedOp create(OpBuilder &builder, Location location, const char* name) { + return NamedOp(name); + } +}; +} // namespace mlir + +void f() { + mlir::OpBuilder builder; + // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: Use OpType::create(builder, ...) instead of builder.create<OpType>(...) [mlir-op-builder] + // CHECK-FIXES: mlir:: ModuleOp::create(builder, builder.getUnknownLoc()) + builder.create<mlir:: ModuleOp>(builder.getUnknownLoc()); + + using mlir::NamedOp; + // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: Use OpType::create(builder, ...) instead of builder.create<OpType>(...) [mlir-op-builder] + // CHECK-FIXES: NamedOp::create(builder, builder.getUnknownLoc(), "baz") + builder.create<NamedOp>(builder.getUnknownLoc(), "baz"); + + mlir::ImplicitLocOpBuilder ib; + // Note: extra space in the case where there is no other arguments. Could be + // improved, but also clang-format will do that just post. + // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: Use OpType::create(builder, ...) instead of builder.create<OpType>(...) [mlir-op-builder] + // CHECK-FIXES: mlir::ModuleOp::create(ib ) + ib.create<mlir::ModuleOp>(); +} >From 34b2a3a586ac6730b1f0e1f1f124a5f7d5d17ac2 Mon Sep 17 00:00:00 2001 From: Jacques Pienaar <jacques...@japienaar.info> Date: Thu, 17 Jul 2025 01:25:27 +0000 Subject: [PATCH 2/7] Move into LLVM module as this seems better spot given lack of other planned rewrites & limited scope --- clang-tools-extra/clang-tidy/CMakeLists.txt | 2 - .../clang-tidy/ClangTidyForceLinker.h | 5 --- .../clang-tidy/llvm/CMakeLists.txt | 2 + .../clang-tidy/llvm/LLVMTidyModule.cpp | 2 + .../MLIROpBuilderCheck.cpp} | 12 +++--- .../clang-tidy/llvm/MLIROpBuilderCheck.h | 21 ++++++++++ .../clang-tidy/mlir/CMakeLists.txt | 28 ------------- .../clang-tidy/mlir/MLIRTidyModule.cpp | 39 ------------------- .../clang-tidy/mlir/OpBuilderCheck.h | 21 ---------- clang-tools-extra/docs/ReleaseNotes.rst | 4 +- .../docs/clang-tidy/checks/list.rst | 3 +- .../mlir-op-builder.rst} | 8 ++-- .../mlir_op_builder.cpp} | 8 ++-- 13 files changed, 42 insertions(+), 113 deletions(-) rename clang-tools-extra/clang-tidy/{mlir/OpBuilderCheck.cpp => llvm/MLIROpBuilderCheck.cpp} (91%) create mode 100644 clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.h delete mode 100644 clang-tools-extra/clang-tidy/mlir/CMakeLists.txt delete mode 100644 clang-tools-extra/clang-tidy/mlir/MLIRTidyModule.cpp delete mode 100644 clang-tools-extra/clang-tidy/mlir/OpBuilderCheck.h rename clang-tools-extra/docs/clang-tidy/checks/{mlir/op-builder.rst => llvm/mlir-op-builder.rst} (57%) rename clang-tools-extra/test/clang-tidy/checkers/{mlir/op_builder.cpp => llvm/mlir_op_builder.cpp} (83%) diff --git a/clang-tools-extra/clang-tidy/CMakeLists.txt b/clang-tools-extra/clang-tidy/CMakeLists.txt index b89003bf6c926..93117cf1d6373 100644 --- a/clang-tools-extra/clang-tidy/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/CMakeLists.txt @@ -66,7 +66,6 @@ add_subdirectory(linuxkernel) add_subdirectory(llvm) add_subdirectory(llvmlibc) add_subdirectory(misc) -add_subdirectory(mlir) add_subdirectory(modernize) if(CLANG_TIDY_ENABLE_STATIC_ANALYZER) add_subdirectory(mpi) @@ -94,7 +93,6 @@ set(ALL_CLANG_TIDY_CHECKS clangTidyLLVMModule clangTidyLLVMLibcModule clangTidyMiscModule - clangTidyMLIRModule clangTidyModernizeModule clangTidyObjCModule clangTidyOpenMPModule diff --git a/clang-tools-extra/clang-tidy/ClangTidyForceLinker.h b/clang-tools-extra/clang-tidy/ClangTidyForceLinker.h index 3cde93124c6e4..adde9136ff1dd 100644 --- a/clang-tools-extra/clang-tidy/ClangTidyForceLinker.h +++ b/clang-tools-extra/clang-tidy/ClangTidyForceLinker.h @@ -94,11 +94,6 @@ extern volatile int MiscModuleAnchorSource; static int LLVM_ATTRIBUTE_UNUSED MiscModuleAnchorDestination = MiscModuleAnchorSource; -// This anchor is used to force the linker to link the MLIRModule. -extern volatile int MLIRModuleAnchorSource; -static int LLVM_ATTRIBUTE_UNUSED MLIRModuleAnchorDestination = - MLIRModuleAnchorSource; - // This anchor is used to force the linker to link the ModernizeModule. extern volatile int ModernizeModuleAnchorSource; static int LLVM_ATTRIBUTE_UNUSED ModernizeModuleAnchorDestination = diff --git a/clang-tools-extra/clang-tidy/llvm/CMakeLists.txt b/clang-tools-extra/clang-tidy/llvm/CMakeLists.txt index 3232f6e2cafe5..70fc4b24cfed5 100644 --- a/clang-tools-extra/clang-tidy/llvm/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/llvm/CMakeLists.txt @@ -7,6 +7,7 @@ add_clang_library(clangTidyLLVMModule STATIC HeaderGuardCheck.cpp IncludeOrderCheck.cpp LLVMTidyModule.cpp + MLIROpBuilderCheck.cpp PreferIsaOrDynCastInConditionalsCheck.cpp PreferRegisterOverUnsignedCheck.cpp PreferStaticOverAnonymousNamespaceCheck.cpp @@ -16,6 +17,7 @@ add_clang_library(clangTidyLLVMModule STATIC clangTidy clangTidyReadabilityModule clangTidyUtils + clangTransformer DEPENDS omp_gen diff --git a/clang-tools-extra/clang-tidy/llvm/LLVMTidyModule.cpp b/clang-tools-extra/clang-tidy/llvm/LLVMTidyModule.cpp index 075453046f0a1..40c906a62b22d 100644 --- a/clang-tools-extra/clang-tidy/llvm/LLVMTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/llvm/LLVMTidyModule.cpp @@ -14,6 +14,7 @@ #include "../readability/QualifiedAutoCheck.h" #include "HeaderGuardCheck.h" #include "IncludeOrderCheck.h" +#include "MLIROpBuilderCheck.h" #include "PreferIsaOrDynCastInConditionalsCheck.h" #include "PreferRegisterOverUnsignedCheck.h" #include "PreferStaticOverAnonymousNamespaceCheck.h" @@ -40,6 +41,7 @@ class LLVMModule : public ClangTidyModule { CheckFactories.registerCheck<readability::QualifiedAutoCheck>( "llvm-qualified-auto"); CheckFactories.registerCheck<TwineLocalCheck>("llvm-twine-local"); + CheckFactories.registerCheck<MlirOpBuilderCheck>("llvm-mlir-op-builder"); } ClangTidyOptions getModuleOptions() override { diff --git a/clang-tools-extra/clang-tidy/mlir/OpBuilderCheck.cpp b/clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.cpp similarity index 91% rename from clang-tools-extra/clang-tidy/mlir/OpBuilderCheck.cpp rename to clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.cpp index 7521096d5b91d..126d4d3d649d7 100644 --- a/clang-tools-extra/clang-tidy/mlir/OpBuilderCheck.cpp +++ b/clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.cpp @@ -1,4 +1,4 @@ -//===--- OpBuilderCheck.cpp - clang-tidy ----------------------------------===// +//===--- MLIROpBuilderCheck.cpp - clang-tidy -------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -#include "OpBuilderCheck.h" +#include "MLIROpBuilderCheck.h" #include "clang/ASTMatchers/ASTMatchers.h" #include "clang/Basic/LLVM.h" #include "clang/Lex/Lexer.h" @@ -16,7 +16,7 @@ #include "clang/Tooling/Transformer/Stencil.h" #include "llvm/Support/Error.h" -namespace clang::tidy::mlir_check { +namespace clang::tidy::llvm_check { namespace { using namespace ::clang::ast_matchers; // NOLINT: Too many names. @@ -80,7 +80,7 @@ Stencil typeAsWritten(StringRef Id) { return std::make_shared<TypeAsWrittenStencil>(std::string(Id)); } -RewriteRuleWith<std::string> OpBuilderCheckRule() { +RewriteRuleWith<std::string> MlirOpBuilderCheckRule() { return makeRule( cxxMemberCallExpr( on(expr(hasType( @@ -96,7 +96,7 @@ RewriteRuleWith<std::string> OpBuilderCheckRule() { } } // namespace -OpBuilderCheck::OpBuilderCheck(StringRef Name, ClangTidyContext *Context) - : TransformerClangTidyCheck(OpBuilderCheckRule(), Name, Context) {} +MlirOpBuilderCheck::MlirOpBuilderCheck(StringRef Name, ClangTidyContext *Context) + : TransformerClangTidyCheck(MlirOpBuilderCheckRule(), Name, Context) {} } // namespace clang::tidy::mlir_check diff --git a/clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.h b/clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.h new file mode 100644 index 0000000000000..d0d356e0f2711 --- /dev/null +++ b/clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.h @@ -0,0 +1,21 @@ +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_MLIROPBUILDERCHECK_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_MLIROPBUILDERCHECK_H + +#include "../utils/TransformerClangTidyCheck.h" + +namespace clang::tidy::llvm_check { + +/// Checks for uses of MLIR's `OpBuilder::create<T>` and suggests using +/// `T::create` instead. +class MlirOpBuilderCheck : public utils::TransformerClangTidyCheck { +public: + MlirOpBuilderCheck(StringRef Name, ClangTidyContext *Context); + + bool isLanguageVersionSupported(const LangOptions &LangOpts) const override { + return getLangOpts().CPlusPlus; + } +}; + +} // namespace clang::tidy::llvm_check + +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_MLIROPBUILDERCHECK_H diff --git a/clang-tools-extra/clang-tidy/mlir/CMakeLists.txt b/clang-tools-extra/clang-tidy/mlir/CMakeLists.txt deleted file mode 100644 index 7d0b2de1df24c..0000000000000 --- a/clang-tools-extra/clang-tidy/mlir/CMakeLists.txt +++ /dev/null @@ -1,28 +0,0 @@ -set(LLVM_LINK_COMPONENTS - FrontendOpenMP - Support - ) - -add_clang_library(clangTidyMLIRModule STATIC - MLIRTidyModule.cpp - OpBuilderCheck.cpp - - LINK_LIBS - clangTidy - clangTidyReadabilityModule - clangTidyUtils - clangTransformer - - DEPENDS - omp_gen - ClangDriverOptions - ) - -clang_target_link_libraries(clangTidyMLIRModule - PRIVATE - clangAST - clangASTMatchers - clangBasic - clangLex - clangTooling - ) diff --git a/clang-tools-extra/clang-tidy/mlir/MLIRTidyModule.cpp b/clang-tools-extra/clang-tidy/mlir/MLIRTidyModule.cpp deleted file mode 100644 index f542020a0afdd..0000000000000 --- a/clang-tools-extra/clang-tidy/mlir/MLIRTidyModule.cpp +++ /dev/null @@ -1,39 +0,0 @@ -//===--- MLIRTidyModule.cpp - clang-tidy ----------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#include "../ClangTidy.h" -#include "../ClangTidyModule.h" -#include "../ClangTidyModuleRegistry.h" -#include "OpBuilderCheck.h" - -namespace clang::tidy { -namespace mlir_check { - -class MLIRModule : public ClangTidyModule { -public: - void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override { - CheckFactories.registerCheck<OpBuilderCheck>("mlir-op-builder"); - } - - ClangTidyOptions getModuleOptions() override { - ClangTidyOptions Options; - return Options; - } -}; - -// Register the ModuleModule using this statically initialized variable. -static ClangTidyModuleRegistry::Add<MLIRModule> X("mlir-module", - "Adds MLIR lint checks."); - -} // namespace mlir_check - -// This anchor is used to force the linker to link in the generated object file -// and thus register the MLIRModule. -volatile int MLIRModuleAnchorSource = 0; // NOLINT(misc-use-internal-linkage) - -} // namespace clang::tidy diff --git a/clang-tools-extra/clang-tidy/mlir/OpBuilderCheck.h b/clang-tools-extra/clang-tidy/mlir/OpBuilderCheck.h deleted file mode 100644 index 792ac7b782add..0000000000000 --- a/clang-tools-extra/clang-tidy/mlir/OpBuilderCheck.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MLIR_OPBUILDERCHECK_H -#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MLIR_OPBUILDERCHECK_H - -#include "../utils/TransformerClangTidyCheck.h" - -namespace clang::tidy::mlir_check { - -/// Checks for uses of `OpBuilder::create<T>` and suggests using `T::create` -/// instead. -class OpBuilderCheck : public utils::TransformerClangTidyCheck { -public: - OpBuilderCheck(StringRef Name, ClangTidyContext *Context); - - bool isLanguageVersionSupported(const LangOptions &LangOpts) const override { - return getLangOpts().CPlusPlus; - } -}; - -} // namespace clang::tidy::mlir_check - -#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MLIR_OPBUILDERCHECK_H diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 09cb793533837..aeefcb1532772 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -96,8 +96,8 @@ Improvements to clang-tidy New checks ^^^^^^^^^^ -- New :doc:`mlir-op-builder - <clang-tidy/checks/mlir/op-builder>` check. +- New :doc:`llvm-mlir-op-builder + <clang-tidy/checks/llvm/mlir-op-builder>` check. Flags usage of old OpBuilder format. diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst b/clang-tools-extra/docs/clang-tidy/checks/list.rst index 49cd008e7588c..ea911c9363ef0 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/list.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst @@ -24,7 +24,6 @@ Clang-Tidy Checks llvm/* llvmlibc/* misc/* - mlir/* modernize/* mpi/* objc/* @@ -248,6 +247,7 @@ Clang-Tidy Checks :doc:`linuxkernel-must-check-errs <linuxkernel/must-check-errs>`, :doc:`llvm-header-guard <llvm/header-guard>`, :doc:`llvm-include-order <llvm/include-order>`, "Yes" + :doc:`llvm-mlir-op-builder <llvm/mlir-op-builder>`, "Yes" :doc:`llvm-namespace-comment <llvm/namespace-comment>`, :doc:`llvm-prefer-isa-or-dyn-cast-in-conditionals <llvm/prefer-isa-or-dyn-cast-in-conditionals>`, "Yes" :doc:`llvm-prefer-register-over-unsigned <llvm/prefer-register-over-unsigned>`, "Yes" @@ -280,7 +280,6 @@ Clang-Tidy Checks :doc:`misc-unused-using-decls <misc/unused-using-decls>`, "Yes" :doc:`misc-use-anonymous-namespace <misc/use-anonymous-namespace>`, :doc:`misc-use-internal-linkage <misc/use-internal-linkage>`, "Yes" - :doc:`mlir-op-builder <mlir/op-builder>`, "Yes" :doc:`modernize-avoid-bind <modernize/avoid-bind>`, "Yes" :doc:`modernize-avoid-c-arrays <modernize/avoid-c-arrays>`, :doc:`modernize-concat-nested-namespaces <modernize/concat-nested-namespaces>`, "Yes" diff --git a/clang-tools-extra/docs/clang-tidy/checks/mlir/op-builder.rst b/clang-tools-extra/docs/clang-tidy/checks/llvm/mlir-op-builder.rst similarity index 57% rename from clang-tools-extra/docs/clang-tidy/checks/mlir/op-builder.rst rename to clang-tools-extra/docs/clang-tidy/checks/llvm/mlir-op-builder.rst index 30bae06a36836..1a4b88a7492ef 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/mlir/op-builder.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/llvm/mlir-op-builder.rst @@ -1,10 +1,10 @@ -.. title:: clang-tidy - mlir-op-builder +.. title:: clang-tidy - llvm-mlir-op-builder -mlir-op-builder +llvm-mlir-op-builder =============== -Flags usage of old form of invoking create on `OpBuilder` and suggesting new -form. +Flags usage of old form of invoking create on MLIR's `OpBuilder` and suggesting +new form. Example ------- diff --git a/clang-tools-extra/test/clang-tidy/checkers/mlir/op_builder.cpp b/clang-tools-extra/test/clang-tidy/checkers/llvm/mlir_op_builder.cpp similarity index 83% rename from clang-tools-extra/test/clang-tidy/checkers/mlir/op_builder.cpp rename to clang-tools-extra/test/clang-tidy/checkers/llvm/mlir_op_builder.cpp index bf60c665e86ad..27e91a2be37e3 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/mlir/op_builder.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/llvm/mlir_op_builder.cpp @@ -1,4 +1,4 @@ -// RUN: %check_clang_tidy --match-partial-fixes %s mlir-op-builder %t +// RUN: %check_clang_tidy --match-partial-fixes %s llvm-mlir-op-builder %t namespace mlir { class Location {}; @@ -33,19 +33,19 @@ struct NamedOp { void f() { mlir::OpBuilder builder; - // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: Use OpType::create(builder, ...) instead of builder.create<OpType>(...) [mlir-op-builder] + // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: Use OpType::create(builder, ...) instead of builder.create<OpType>(...) [llvm-mlir-op-builder] // CHECK-FIXES: mlir:: ModuleOp::create(builder, builder.getUnknownLoc()) builder.create<mlir:: ModuleOp>(builder.getUnknownLoc()); using mlir::NamedOp; - // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: Use OpType::create(builder, ...) instead of builder.create<OpType>(...) [mlir-op-builder] + // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: Use OpType::create(builder, ...) instead of builder.create<OpType>(...) [llvm-mlir-op-builder] // CHECK-FIXES: NamedOp::create(builder, builder.getUnknownLoc(), "baz") builder.create<NamedOp>(builder.getUnknownLoc(), "baz"); mlir::ImplicitLocOpBuilder ib; // Note: extra space in the case where there is no other arguments. Could be // improved, but also clang-format will do that just post. - // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: Use OpType::create(builder, ...) instead of builder.create<OpType>(...) [mlir-op-builder] + // CHECK-MESSAGES: :[[@LINE+2]]:3: warning: Use OpType::create(builder, ...) instead of builder.create<OpType>(...) [llvm-mlir-op-builder] // CHECK-FIXES: mlir::ModuleOp::create(ib ) ib.create<mlir::ModuleOp>(); } >From dc85637888fc9aec62da37fd8c29d108ecb0a4a2 Mon Sep 17 00:00:00 2001 From: Jacques Pienaar <jacques...@japienaar.info> Date: Thu, 17 Jul 2025 01:25:51 +0000 Subject: [PATCH 3/7] Fix formatting --- clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.cpp b/clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.cpp index 126d4d3d649d7..c17e319287da2 100644 --- a/clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.cpp +++ b/clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.cpp @@ -1,4 +1,5 @@ -//===--- MLIROpBuilderCheck.cpp - clang-tidy -------------------------------===// +//===--- MLIROpBuilderCheck.cpp - clang-tidy +//-------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -96,7 +97,8 @@ RewriteRuleWith<std::string> MlirOpBuilderCheckRule() { } } // namespace -MlirOpBuilderCheck::MlirOpBuilderCheck(StringRef Name, ClangTidyContext *Context) +MlirOpBuilderCheck::MlirOpBuilderCheck(StringRef Name, + ClangTidyContext *Context) : TransformerClangTidyCheck(MlirOpBuilderCheckRule(), Name, Context) {} -} // namespace clang::tidy::mlir_check +} // namespace clang::tidy::llvm_check >From a74232f829640a6796ce091a7da0a4b686f7a01d Mon Sep 17 00:00:00 2001 From: Jacques Pienaar <jacques...@japienaar.info> Date: Thu, 17 Jul 2025 04:06:37 +0000 Subject: [PATCH 4/7] Address review comments --- .../clang-tidy/llvm/MLIROpBuilderCheck.cpp | 13 ++++++------- clang-tools-extra/docs/ReleaseNotes.rst | 3 ++- .../docs/clang-tidy/checks/llvm/mlir-op-builder.rst | 5 ++--- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.cpp b/clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.cpp index c17e319287da2..12c115946f9ea 100644 --- a/clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.cpp +++ b/clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.cpp @@ -1,5 +1,4 @@ -//===--- MLIROpBuilderCheck.cpp - clang-tidy -//-------------------------------===// +//===--- MLIROpBuilderCheck.cpp - clang-tidy ------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -32,15 +31,15 @@ class TypeAsWrittenStencil : public StencilInterface { llvm::Error eval(const MatchFinder::MatchResult &match, std::string *result) const override { - auto n = node(id)(match); + RangeSelector n = node(id)(match); if (!n) return n.takeError(); - auto srcRange = n->getAsRange(); + SourceRange srcRange = n->getAsRange(); if (srcRange.isInvalid()) { return llvm::make_error<llvm::StringError>(llvm::errc::invalid_argument, "srcRange is invalid"); } - auto range = n->getTokenRange(srcRange); + const CharSourceRange range = n->getTokenRange(srcRange); auto nextToken = [&](std::optional<Token> token) { if (!token) return token; @@ -48,7 +47,7 @@ class TypeAsWrittenStencil : public StencilInterface { *match.SourceManager, match.Context->getLangOpts()); }; - auto lessToken = clang::Lexer::findNextToken( + std::optional<Token> lessToken = clang::Lexer::findNextToken( range.getBegin(), *match.SourceManager, match.Context->getLangOpts()); while (lessToken && lessToken->getKind() != clang::tok::less) { lessToken = nextToken(lessToken); @@ -58,7 +57,7 @@ class TypeAsWrittenStencil : public StencilInterface { "missing '<' token"); } std::optional<Token> endToken = nextToken(lessToken); - for (auto greaterToken = nextToken(endToken); + for (std::optional<Token> greaterToken = nextToken(endToken); greaterToken && greaterToken->getKind() != clang::tok::greater; greaterToken = nextToken(greaterToken)) { endToken = greaterToken; diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index aeefcb1532772..e738570ac9b82 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -99,7 +99,8 @@ New checks - New :doc:`llvm-mlir-op-builder <clang-tidy/checks/llvm/mlir-op-builder>` check. - Flags usage of old OpBuilder format. + Flags usage of old form of invoking create on MLIR's `OpBuilder` and suggests + new form. New check aliases ^^^^^^^^^^^^^^^^^ diff --git a/clang-tools-extra/docs/clang-tidy/checks/llvm/mlir-op-builder.rst b/clang-tools-extra/docs/clang-tidy/checks/llvm/mlir-op-builder.rst index 1a4b88a7492ef..e45360d33b4fa 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/llvm/mlir-op-builder.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/llvm/mlir-op-builder.rst @@ -1,9 +1,9 @@ .. title:: clang-tidy - llvm-mlir-op-builder llvm-mlir-op-builder -=============== +==================== -Flags usage of old form of invoking create on MLIR's `OpBuilder` and suggesting +Flags usage of old form of invoking create on MLIR's `OpBuilder` and suggests new form. Example @@ -19,4 +19,3 @@ Transforms to: .. code-block:: c++ FooOp::create(builder, builder.getUnknownLoc(), "baz"); - >From 4fe574aaac7d7ce314fbac24e0f10a1f0014649c Mon Sep 17 00:00:00 2001 From: Jacques Pienaar <jacques...@japienaar.info> Date: Thu, 17 Jul 2025 04:09:41 +0000 Subject: [PATCH 5/7] Address missed review comments --- clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.h | 8 ++++++++ clang-tools-extra/docs/ReleaseNotes.rst | 4 ++-- .../docs/clang-tidy/checks/llvm/mlir-op-builder.rst | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.h b/clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.h index d0d356e0f2711..9dbbf239da50b 100644 --- a/clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.h +++ b/clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.h @@ -1,3 +1,11 @@ +//===--- MLIROpBuilderCheck.h - clang-tidy ----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_MLIROPBUILDERCHECK_H #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_MLIROPBUILDERCHECK_H diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index e738570ac9b82..5f8467c969cae 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -99,8 +99,8 @@ New checks - New :doc:`llvm-mlir-op-builder <clang-tidy/checks/llvm/mlir-op-builder>` check. - Flags usage of old form of invoking create on MLIR's `OpBuilder` and suggests - new form. + Flags usage of old form of invoking create on MLIR's ``OpBuilder`` and + suggests new form. New check aliases ^^^^^^^^^^^^^^^^^ diff --git a/clang-tools-extra/docs/clang-tidy/checks/llvm/mlir-op-builder.rst b/clang-tools-extra/docs/clang-tidy/checks/llvm/mlir-op-builder.rst index e45360d33b4fa..7d45399842c2b 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/llvm/mlir-op-builder.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/llvm/mlir-op-builder.rst @@ -3,7 +3,7 @@ llvm-mlir-op-builder ==================== -Flags usage of old form of invoking create on MLIR's `OpBuilder` and suggests +Flags usage of old form of invoking create on MLIR's ``OpBuilder`` and suggests new form. Example >From a25b8aff022a0bab37b013bc8eb242571847ed82 Mon Sep 17 00:00:00 2001 From: Jacques Pienaar <jacques...@japienaar.info> Date: Thu, 17 Jul 2025 04:17:18 +0000 Subject: [PATCH 6/7] Fix wrong type --- clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.cpp b/clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.cpp index 12c115946f9ea..7e63a19190fe4 100644 --- a/clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.cpp +++ b/clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.cpp @@ -31,7 +31,7 @@ class TypeAsWrittenStencil : public StencilInterface { llvm::Error eval(const MatchFinder::MatchResult &match, std::string *result) const override { - RangeSelector n = node(id)(match); + llvm::Expected<CharSourceRange> n = node(id)(match); if (!n) return n.takeError(); SourceRange srcRange = n->getAsRange(); >From 9a86c0fbdafb02861341f2e04558f6cb0295afb6 Mon Sep 17 00:00:00 2001 From: Jacques Pienaar <jacques...@japienaar.info> Date: Thu, 17 Jul 2025 15:36:30 +0000 Subject: [PATCH 7/7] Address clang-tidy warnings except in mlir_op_builder.cpp which is following MLIR coding conventions --- .../clang-tidy/llvm/MLIROpBuilderCheck.cpp | 54 +++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.cpp b/clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.cpp index 7e63a19190fe4..46c3b4f8a0cca 100644 --- a/clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.cpp +++ b/clang-tools-extra/clang-tidy/llvm/MLIROpBuilderCheck.cpp @@ -24,55 +24,55 @@ using namespace ::clang::transformer; // NOLINT: Too many names. class TypeAsWrittenStencil : public StencilInterface { public: - explicit TypeAsWrittenStencil(std::string S) : id(std::move(S)) {} + explicit TypeAsWrittenStencil(std::string S) : Id(std::move(S)) {} std::string toString() const override { - return (llvm::Twine("TypeAsWritten(\"") + id + "\")").str(); + return (llvm::Twine("TypeAsWritten(\"") + Id + "\")").str(); } llvm::Error eval(const MatchFinder::MatchResult &match, std::string *result) const override { - llvm::Expected<CharSourceRange> n = node(id)(match); + llvm::Expected<CharSourceRange> n = node(Id)(match); if (!n) return n.takeError(); - SourceRange srcRange = n->getAsRange(); - if (srcRange.isInvalid()) { + const SourceRange SrcRange = n->getAsRange(); + if (SrcRange.isInvalid()) { return llvm::make_error<llvm::StringError>(llvm::errc::invalid_argument, - "srcRange is invalid"); + "SrcRange is invalid"); } - const CharSourceRange range = n->getTokenRange(srcRange); - auto nextToken = [&](std::optional<Token> token) { - if (!token) - return token; - return clang::Lexer::findNextToken(token->getLocation(), + const CharSourceRange Range = n->getTokenRange(SrcRange); + auto NextToken = [&](std::optional<Token> Token) { + if (!Token) + return Token; + return clang::Lexer::findNextToken(Token->getLocation(), *match.SourceManager, match.Context->getLangOpts()); }; - std::optional<Token> lessToken = clang::Lexer::findNextToken( - range.getBegin(), *match.SourceManager, match.Context->getLangOpts()); - while (lessToken && lessToken->getKind() != clang::tok::less) { - lessToken = nextToken(lessToken); + std::optional<Token> LessToken = clang::Lexer::findNextToken( + Range.getBegin(), *match.SourceManager, match.Context->getLangOpts()); + while (LessToken && LessToken->getKind() != clang::tok::less) { + LessToken = NextToken(LessToken); } - if (!lessToken) { + if (!LessToken) { return llvm::make_error<llvm::StringError>(llvm::errc::invalid_argument, "missing '<' token"); } - std::optional<Token> endToken = nextToken(lessToken); - for (std::optional<Token> greaterToken = nextToken(endToken); - greaterToken && greaterToken->getKind() != clang::tok::greater; - greaterToken = nextToken(greaterToken)) { - endToken = greaterToken; + std::optional<Token> EndToken = NextToken(LessToken); + for (std::optional<Token> GreaterToken = NextToken(EndToken); + GreaterToken && GreaterToken->getKind() != clang::tok::greater; + GreaterToken = NextToken(GreaterToken)) { + EndToken = GreaterToken; } - if (!endToken) { + if (!EndToken) { return llvm::make_error<llvm::StringError>(llvm::errc::invalid_argument, "missing '>' token"); } *result += clang::tooling::getText( - CharSourceRange::getTokenRange(lessToken->getEndLoc(), - endToken->getLastLoc()), + CharSourceRange::getTokenRange(LessToken->getEndLoc(), + EndToken->getLastLoc()), *match.Context); return llvm::Error::success(); } - std::string id; + std::string Id; }; Stencil typeAsWritten(StringRef Id) { @@ -80,7 +80,7 @@ Stencil typeAsWritten(StringRef Id) { return std::make_shared<TypeAsWrittenStencil>(std::string(Id)); } -RewriteRuleWith<std::string> MlirOpBuilderCheckRule() { +RewriteRuleWith<std::string> mlirOpBuilderCheckRule() { return makeRule( cxxMemberCallExpr( on(expr(hasType( @@ -98,6 +98,6 @@ RewriteRuleWith<std::string> MlirOpBuilderCheckRule() { MlirOpBuilderCheck::MlirOpBuilderCheck(StringRef Name, ClangTidyContext *Context) - : TransformerClangTidyCheck(MlirOpBuilderCheckRule(), Name, Context) {} + : TransformerClangTidyCheck(mlirOpBuilderCheckRule(), Name, Context) {} } // namespace clang::tidy::llvm_check _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits