[clang-tools-extra] [clang-tidy] Add IgnoreMacros option to modernize-pass-by-value (PR #181465)
via cfe-commits
cfe-commits at lists.llvm.org
Sat Feb 14 00:15:10 PST 2026
https://github.com/zeyi2 created https://github.com/llvm/llvm-project/pull/181465
We need this option to address #156153
>From d6175fd386f47142ff72fbdaad4de2b08a955d90 Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Sat, 14 Feb 2026 15:58:54 +0800
Subject: [PATCH] [clang-tidy] Add IgnoreMacros option to
modernize-pass-by-value
---
.../clang-tidy/modernize/PassByValueCheck.cpp | 7 +++++-
.../clang-tidy/modernize/PassByValueCheck.h | 1 +
clang-tools-extra/docs/ReleaseNotes.rst | 4 ++++
.../checks/modernize/pass-by-value.rst | 5 ++++
.../modernize/pass-by-value-ignore-macros.cpp | 24 +++++++++++++++++++
5 files changed, 40 insertions(+), 1 deletion(-)
create mode 100644 clang-tools-extra/test/clang-tidy/checkers/modernize/pass-by-value-ignore-macros.cpp
diff --git a/clang-tools-extra/clang-tidy/modernize/PassByValueCheck.cpp b/clang-tools-extra/clang-tidy/modernize/PassByValueCheck.cpp
index 9f2c3eb65a3ca..2619331cba0b0 100644
--- a/clang-tools-extra/clang-tidy/modernize/PassByValueCheck.cpp
+++ b/clang-tools-extra/clang-tidy/modernize/PassByValueCheck.cpp
@@ -216,11 +216,13 @@ PassByValueCheck::PassByValueCheck(StringRef Name, ClangTidyContext *Context)
Inserter(Options.getLocalOrGlobal("IncludeStyle",
utils::IncludeSorter::IS_LLVM),
areDiagsSelfContained()),
- ValuesOnly(Options.get("ValuesOnly", false)) {}
+ ValuesOnly(Options.get("ValuesOnly", false)),
+ IgnoreMacros(Options.get("IgnoreMacros", false)) {}
void PassByValueCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
Options.store(Opts, "IncludeStyle", Inserter.getStyle());
Options.store(Opts, "ValuesOnly", ValuesOnly);
+ Options.store(Opts, "IgnoreMacros", IgnoreMacros);
}
void PassByValueCheck::registerMatchers(MatchFinder *Finder) {
@@ -273,6 +275,9 @@ void PassByValueCheck::check(const MatchFinder::MatchResult &Result) {
Result.Nodes.getNodeAs<CXXCtorInitializer>("Initializer");
const SourceManager &SM = *Result.SourceManager;
+ if (IgnoreMacros && ParamDecl->getBeginLoc().isMacroID())
+ return;
+
// If the parameter is used or anything other than the copy, do not apply
// the changes.
if (!paramReferredExactlyOnce(Ctor, ParamDecl))
diff --git a/clang-tools-extra/clang-tidy/modernize/PassByValueCheck.h b/clang-tools-extra/clang-tidy/modernize/PassByValueCheck.h
index eb51f4a4c46ac..aefc81842e633 100644
--- a/clang-tools-extra/clang-tidy/modernize/PassByValueCheck.h
+++ b/clang-tools-extra/clang-tidy/modernize/PassByValueCheck.h
@@ -29,6 +29,7 @@ class PassByValueCheck : public ClangTidyCheck {
private:
utils::IncludeInserter Inserter;
const bool ValuesOnly;
+ const bool IgnoreMacros;
};
} // namespace clang::tidy::modernize
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 5c0060877a67f..6799b2c136f38 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -199,6 +199,10 @@ Changes in existing checks
- Added support for analyzing function parameters with the `AnalyzeParameters`
option.
+- Improved :doc:`modernize-pass-by-value
+ <clang-tidy/checks/modernize/pass-by-value>` check by adding `IgnoreMacros`
+ option to suppress warnings in macros.
+
- Improved :doc:`modernize-use-std-format
<clang-tidy/checks/modernize/use-std-format>` check by fixing a crash
when an argument is part of a macro expansion.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/modernize/pass-by-value.rst b/clang-tools-extra/docs/clang-tidy/checks/modernize/pass-by-value.rst
index b8d933aab702c..0f5758dc097e6 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/modernize/pass-by-value.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/modernize/pass-by-value.rst
@@ -164,3 +164,8 @@ Options
When `true`, the check only warns about copied parameters that are already
passed by value. Default is `false`.
+
+.. option:: IgnoreMacros
+
+ When `true`, the check will not give warnings inside macros. Default is
+ `false`.
diff --git a/clang-tools-extra/test/clang-tidy/checkers/modernize/pass-by-value-ignore-macros.cpp b/clang-tools-extra/test/clang-tidy/checkers/modernize/pass-by-value-ignore-macros.cpp
new file mode 100644
index 0000000000000..8b21e97b0fd1f
--- /dev/null
+++ b/clang-tools-extra/test/clang-tidy/checkers/modernize/pass-by-value-ignore-macros.cpp
@@ -0,0 +1,24 @@
+// RUN: %check_clang_tidy -check-suffixes=DEFAULT %s modernize-pass-by-value %t -- -config="{CheckOptions: {modernize-pass-by-value.IgnoreMacros: false}}"
+// RUN: %check_clang_tidy -check-suffixes=IGNORE %s modernize-pass-by-value %t -- -config="{CheckOptions: {modernize-pass-by-value.IgnoreMacros: true}}"
+
+struct A {
+ A(const A &);
+ A(A &&);
+};
+
+#define MACRO_CTOR(TYPE) \
+struct TYPE { \
+ TYPE(const A &a) : a(a) {} \
+ A a; \
+};
+// CHECK-MESSAGES-DEFAULT: :[[@LINE+3]]:1: warning: pass by value and use std::move [modernize-pass-by-value]
+// CHECK-MESSAGES-IGNORE-NOT: warning: pass by value and use std::move
+
+MACRO_CTOR(B)
+
+struct C {
+ C(const A &a) : a(a) {}
+ A a;
+};
+// CHECK-MESSAGES-DEFAULT: :[[@LINE-3]]:5: warning: pass by value and use std::move [modernize-pass-by-value]
+// CHECK-MESSAGES-IGNORE: :[[@LINE-4]]:5: warning: pass by value and use std::move [modernize-pass-by-value]
More information about the cfe-commits
mailing list