This revision was automatically updated to reflect the committed changes.
Closed by commit rG0e325081192b: [clang-tidy] Support concepts in
`bugprone-forwarding-reference-overload` (authored by Izaron, committed by
PiotrZSL).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D135476/new/
https://reviews.llvm.org/D135476
Files:
clang-tools-extra/clang-tidy/bugprone/ForwardingReferenceOverloadCheck.cpp
clang-tools-extra/docs/ReleaseNotes.rst
clang-tools-extra/docs/clang-tidy/checks/bugprone/forwarding-reference-overload.rst
clang-tools-extra/test/clang-tidy/checkers/bugprone/forwarding-reference-overload-concepts.cpp
Index: clang-tools-extra/test/clang-tidy/checkers/bugprone/forwarding-reference-overload-concepts.cpp
===================================================================
--- /dev/null
+++ clang-tools-extra/test/clang-tidy/checkers/bugprone/forwarding-reference-overload-concepts.cpp
@@ -0,0 +1,29 @@
+// RUN: %check_clang_tidy -std=c++20-or-later %s bugprone-forwarding-reference-overload %t
+
+template <typename T> constexpr bool just_true = true;
+
+class Test {
+public:
+ template <typename T> Test(T &&n);
+ // CHECK-NOTES: :[[@LINE-1]]:25: warning: constructor accepting a forwarding reference can hide the copy and move constructors
+
+ Test(const Test &rhs);
+ // CHECK-NOTES: :[[@LINE-1]]:3: note: copy constructor declared here
+};
+
+class Test1 {
+public:
+ // Guarded with requires expression.
+ template <typename T>
+ requires requires { just_true<T>; }
+ Test1(T &&n);
+};
+
+template<typename T>
+concept JustTrueConcept = requires { just_true<T>; };
+
+class Test2 {
+public:
+ // Guarded with concept requirement.
+ template <JustTrueConcept T> Test2(T &&n);
+};
Index: clang-tools-extra/docs/clang-tidy/checks/bugprone/forwarding-reference-overload.rst
===================================================================
--- clang-tools-extra/docs/clang-tidy/checks/bugprone/forwarding-reference-overload.rst
+++ clang-tools-extra/docs/clang-tidy/checks/bugprone/forwarding-reference-overload.rst
@@ -34,6 +34,15 @@
enable_if_t<is_constructible_v<tuple<string, int>, A&&...>, int> = 0>
explicit Person(A&&... a) {}
+ // C5: perfect forwarding ctor guarded with requires expression
+ template<typename T>
+ requires requires { is_special<T>; }
+ explicit Person(T&& n) {}
+
+ // C6: perfect forwarding ctor guarded with concept requirement
+ template<Special T>
+ explicit Person(T&& n) {}
+
// (possibly compiler generated) copy ctor
Person(const Person& rhs);
};
@@ -42,8 +51,8 @@
constructors. We suppress warnings if the copy and the move constructors are both
disabled (deleted or private), because there is nothing the perfect forwarding
constructor could hide in this case. We also suppress warnings for constructors
-like C3 and C4 that are guarded with an ``enable_if``, assuming the programmer was
-aware of the possible hiding.
+like C3-C6 that are guarded with an ``enable_if`` or a concept, assuming the
+programmer was aware of the possible hiding.
Background
----------
Index: clang-tools-extra/docs/ReleaseNotes.rst
===================================================================
--- clang-tools-extra/docs/ReleaseNotes.rst
+++ clang-tools-extra/docs/ReleaseNotes.rst
@@ -288,6 +288,10 @@
<clang-tidy/checks/bugprone/fold-init-type>` to handle iterators that do not
define `value_type` type aliases.
+- Improved :doc:`bugprone-forwarding-reference-overload
+ <clang-tidy/checks/bugprone/forwarding-reference-overload>` check to ignore
+ constructors with associated constraints (C++ concepts).
+
- Improved :doc:`bugprone-incorrect-roundings
<clang-tidy/checks/bugprone/incorrect-roundings>` check by adding support for
other floating point representations in float constant like ``0.5L``.
Index: clang-tools-extra/clang-tidy/bugprone/ForwardingReferenceOverloadCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/ForwardingReferenceOverloadCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/ForwardingReferenceOverloadCheck.cpp
@@ -56,6 +56,9 @@
return Node.hasDefaultArgument() &&
TypeMatcher.matches(Node.getDefaultArgument(), Finder, Builder);
}
+AST_MATCHER(TemplateDecl, hasAssociatedConstraints) {
+ return Node.hasAssociatedConstraints();
+}
} // namespace
void ForwardingReferenceOverloadCheck::registerMatchers(MatchFinder *Finder) {
@@ -74,6 +77,9 @@
// No warning: enable_if as constructor parameter.
parmVarDecl(hasType(isEnableIf())))),
unless(hasParent(functionTemplateDecl(anyOf(
+ // No warning: has associated constraints (like requires
+ // expression).
+ hasAssociatedConstraints(),
// No warning: enable_if as type parameter.
has(templateTypeParmDecl(hasDefaultArgument(isEnableIf()))),
// No warning: enable_if as non-type template parameter.
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits