[clang-tools-extra] [clang-tidy] Handle auto&& in missing-std-forward (PR #220164)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Sep 2 20:49:33 PDT 2026
https://github.com/frank-suwen updated https://github.com/llvm/llvm-project/pull/220164
>From 53a544be13758013c3125b4b269b23b8be22da35 Mon Sep 17 00:00:00 2001
From: frank-suwen <suwenw2 at outlook.com>
Date: Mon, 31 Aug 2026 23:32:36 -0700
Subject: [PATCH 1/2] [clang-tidy] Handle auto&& in missing-std-forward
---
.../MissingStdForwardCheck.cpp | 4 +---
.../missing-std-forward-cxx20.cpp | 24 +++++++++++++++++++
2 files changed, 25 insertions(+), 3 deletions(-)
create mode 100644 clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/missing-std-forward-cxx20.cpp
diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/MissingStdForwardCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/MissingStdForwardCheck.cpp
index 4a77bd7948615..0cae9e232cd50 100644
--- a/clang-tools-extra/clang-tidy/cppcoreguidelines/MissingStdForwardCheck.cpp
+++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/MissingStdForwardCheck.cpp
@@ -28,9 +28,7 @@ AST_MATCHER_P(QualType, possiblyPackExpansionOf,
AST_MATCHER(ParmVarDecl, isTemplateTypeParameter) {
const ast_matchers::internal::Matcher<QualType> Inner =
possiblyPackExpansionOf(
- qualType(rValueReferenceType(),
- references(templateTypeParmType(
- hasDeclaration(templateTypeParmDecl()))),
+ qualType(rValueReferenceType(), references(templateTypeParmType()),
unless(references(qualType(isConstQualified())))));
if (!Inner.matches(Node.getType(), Finder, Builder))
return false;
diff --git a/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/missing-std-forward-cxx20.cpp b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/missing-std-forward-cxx20.cpp
new file mode 100644
index 0000000000000..b9d682ba6ebb6
--- /dev/null
+++ b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/missing-std-forward-cxx20.cpp
@@ -0,0 +1,24 @@
+// RUN: %check_clang_tidy -std=c++20-or-later %s cppcoreguidelines-missing-std-forward %t -- -- -fno-delayed-template-parsing
+
+#include <utility>
+
+void does_not_forward_auto(auto &&t) {
+ // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: forwarding reference parameter 't' is never forwarded inside the function body [cppcoreguidelines-missing-std-forward]
+ (void)t;
+}
+
+void does_forward_auto(auto &&t) {
+ (void)std::forward<decltype(t)>(t);
+}
+
+void const_auto_rvalue_reference(const auto &&t) {
+ (void)t;
+}
+
+template <typename T>
+void mixed_parameters(T &&t, auto &&u) {
+ // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: forwarding reference parameter 't' is never forwarded inside the function body [cppcoreguidelines-missing-std-forward]
+ // CHECK-MESSAGES: :[[@LINE-2]]:37: warning: forwarding reference parameter 'u' is never forwarded inside the function body [cppcoreguidelines-missing-std-forward]
+ (void)t;
+ (void)u;
+}
>From 438a5df0f0ebfb99d4c37ff10798d7b48336145c Mon Sep 17 00:00:00 2001
From: frank-suwen <suwenw2 at outlook.com>
Date: Wed, 2 Sep 2026 20:48:31 -0700
Subject: [PATCH 2/2] [clang-tidy] Address review feedback on release note and
nit
---
clang-tools-extra/docs/ReleaseNotes.md | 4 ++++
.../cppcoreguidelines/missing-std-forward-cxx20.cpp | 6 +++---
2 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/clang-tools-extra/docs/ReleaseNotes.md b/clang-tools-extra/docs/ReleaseNotes.md
index 6fe497e5f6eaf..4f0a3f374db4d 100644
--- a/clang-tools-extra/docs/ReleaseNotes.md
+++ b/clang-tools-extra/docs/ReleaseNotes.md
@@ -148,6 +148,10 @@ infrastructure are described first, followed by tool-specific sections.
- Improved {doc}`cppcoreguidelines-use-enum-class
<clang-tidy/checks/cppcoreguidelines/use-enum-class>` check by omitting unnamed enums from the `enum class` requirement, as previously the check suggested users an ill-formed fix.
+- Improved {doc}`cppcoreguidelines-missing-std-forward
+ <clang-tidy/checks/cppcoreguidelines/missing-std-forward>` check by diagnosing
+ unforwarded `auto&&` parameters in C++20 abbreviated function templates.
+
- Improved {doc}`misc-const-correctness
<clang-tidy/checks/misc/const-correctness>` check:
diff --git a/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/missing-std-forward-cxx20.cpp b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/missing-std-forward-cxx20.cpp
index b9d682ba6ebb6..cbf3def7800bb 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/missing-std-forward-cxx20.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/missing-std-forward-cxx20.cpp
@@ -3,7 +3,7 @@
#include <utility>
void does_not_forward_auto(auto &&t) {
- // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: forwarding reference parameter 't' is never forwarded inside the function body [cppcoreguidelines-missing-std-forward]
+ // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: forwarding reference parameter 't' is never forwarded inside the function body
(void)t;
}
@@ -17,8 +17,8 @@ void const_auto_rvalue_reference(const auto &&t) {
template <typename T>
void mixed_parameters(T &&t, auto &&u) {
- // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: forwarding reference parameter 't' is never forwarded inside the function body [cppcoreguidelines-missing-std-forward]
- // CHECK-MESSAGES: :[[@LINE-2]]:37: warning: forwarding reference parameter 'u' is never forwarded inside the function body [cppcoreguidelines-missing-std-forward]
+ // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: forwarding reference parameter 't' is never forwarded inside the function body
+ // CHECK-MESSAGES: :[[@LINE-2]]:37: warning: forwarding reference parameter 'u' is never forwarded inside the function body
(void)t;
(void)u;
}
More information about the cfe-commits
mailing list