PiotrZSL updated this revision to Diff 543206.
PiotrZSL edited the summary of this revision.
PiotrZSL added a comment.

rebase, add release notes, move tests to separate file


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
@@ -283,6 +283,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
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
  • [PATCH] D135476: [clang-tidy] ... Piotr Zegar via Phabricator via cfe-commits

Reply via email to