This revision was automatically updated to reflect the committed changes.
Closed by commit rGd038faea4608: [clang-tidy] add option 
performance-move-const-arg.CheckMoveToConstRef (authored by devjgm, committed 
by ymandel).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D119370/new/

https://reviews.llvm.org/D119370

Files:
  clang-tools-extra/clang-tidy/performance/MoveConstArgCheck.cpp
  clang-tools-extra/clang-tidy/performance/MoveConstArgCheck.h
  clang-tools-extra/docs/clang-tidy/checks/performance-move-const-arg.rst
  
clang-tools-extra/test/clang-tidy/checkers/performance-move-const-arg-const-ref.cpp

Index: clang-tools-extra/test/clang-tidy/checkers/performance-move-const-arg-const-ref.cpp
===================================================================
--- /dev/null
+++ clang-tools-extra/test/clang-tidy/checkers/performance-move-const-arg-const-ref.cpp
@@ -0,0 +1,80 @@
+// RUN: %check_clang_tidy %s performance-move-const-arg %t \
+// RUN: -config='{CheckOptions: \
+// RUN:  [{key: performance-move-const-arg.CheckMoveToConstRef, value: false}]}'
+
+namespace std {
+template <typename>
+struct remove_reference;
+
+template <typename _Tp>
+struct remove_reference {
+  typedef _Tp type;
+};
+
+template <typename _Tp>
+struct remove_reference<_Tp &> {
+  typedef _Tp type;
+};
+
+template <typename _Tp>
+struct remove_reference<_Tp &&> {
+  typedef _Tp type;
+};
+
+template <typename _Tp>
+constexpr typename std::remove_reference<_Tp>::type &&move(_Tp &&__t) {
+  return static_cast<typename std::remove_reference<_Tp>::type &&>(__t);
+}
+
+template <typename _Tp>
+constexpr _Tp &&
+forward(typename remove_reference<_Tp>::type &__t) noexcept {
+  return static_cast<_Tp &&>(__t);
+}
+
+} // namespace std
+
+struct TriviallyCopyable {
+  int i;
+};
+
+void f(TriviallyCopyable) {}
+
+void g() {
+  TriviallyCopyable obj;
+  // Some basic test to ensure that other warnings from
+  // performance-move-const-arg are still working and enabled.
+  f(std::move(obj));
+  // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: std::move of the variable 'obj' of the trivially-copyable type 'TriviallyCopyable' has no effect; remove std::move() [performance-move-const-arg]
+  // CHECK-FIXES: f(obj);
+}
+
+class NoMoveSemantics {
+public:
+  NoMoveSemantics();
+  NoMoveSemantics(const NoMoveSemantics &);
+  NoMoveSemantics &operator=(const NoMoveSemantics &);
+};
+
+class MoveSemantics {
+public:
+  MoveSemantics();
+  MoveSemantics(MoveSemantics &&);
+
+  MoveSemantics &operator=(MoveSemantics &&);
+};
+
+void callByConstRef1(const NoMoveSemantics &);
+void callByConstRef2(const MoveSemantics &);
+
+void moveToConstReferencePositives() {
+  NoMoveSemantics a;
+
+  // This call is now allowed since CheckMoveToConstRef is false.
+  callByConstRef1(std::move(a));
+
+  MoveSemantics b;
+
+  // This call is now allowed since CheckMoveToConstRef is false.
+  callByConstRef2(std::move(b));
+}
Index: clang-tools-extra/docs/clang-tidy/checks/performance-move-const-arg.rst
===================================================================
--- clang-tools-extra/docs/clang-tidy/checks/performance-move-const-arg.rst
+++ clang-tools-extra/docs/clang-tidy/checks/performance-move-const-arg.rst
@@ -35,3 +35,8 @@
 
    If `true`, enables detection of trivially copyable types that do not
    have a move constructor. Default is `true`.
+
+.. option:: CheckMoveToConstRef
+
+   If `true`, enables detection of `std::move()` passed as a const
+   reference argument. Default is `true`.
Index: clang-tools-extra/clang-tidy/performance/MoveConstArgCheck.h
===================================================================
--- clang-tools-extra/clang-tidy/performance/MoveConstArgCheck.h
+++ clang-tools-extra/clang-tidy/performance/MoveConstArgCheck.h
@@ -18,16 +18,18 @@
 
 /// Find casts of calculation results to bigger type. Typically from int to
 ///
-/// There is one option:
+/// The options are
 ///
 ///   - `CheckTriviallyCopyableMove`: Whether to check for trivially-copyable
 //      types as their objects are not moved but copied. Enabled by default.
+//    - `CheckMoveToConstRef`: Whether to check if a `std::move()` is passed
+//      as a const reference argument.
 class MoveConstArgCheck : public ClangTidyCheck {
 public:
   MoveConstArgCheck(StringRef Name, ClangTidyContext *Context)
-      : ClangTidyCheck(Name, Context),
-        CheckTriviallyCopyableMove(
-            Options.get("CheckTriviallyCopyableMove", true)) {}
+      : ClangTidyCheck(Name, Context), CheckTriviallyCopyableMove(Options.get(
+                                           "CheckTriviallyCopyableMove", true)),
+        CheckMoveToConstRef(Options.get("CheckMoveToConstRef", true)) {}
   bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
     return LangOpts.CPlusPlus;
   }
@@ -37,6 +39,7 @@
 
 private:
   const bool CheckTriviallyCopyableMove;
+  const bool CheckMoveToConstRef;
   llvm::DenseSet<const CallExpr *> AlreadyCheckedMoves;
 };
 
Index: clang-tools-extra/clang-tidy/performance/MoveConstArgCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/performance/MoveConstArgCheck.cpp
+++ clang-tools-extra/clang-tidy/performance/MoveConstArgCheck.cpp
@@ -37,6 +37,7 @@
 
 void MoveConstArgCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
   Options.store(Opts, "CheckTriviallyCopyableMove", CheckTriviallyCopyableMove);
+  Options.store(Opts, "CheckMoveToConstRef", CheckMoveToConstRef);
 }
 
 void MoveConstArgCheck::registerMatchers(MatchFinder *Finder) {
@@ -193,7 +194,7 @@
           << (InvocationParm->getFunctionScopeIndex() + 1) << FunctionName
           << *InvocationParmType << ExpectParmTypeName;
     }
-  } else if (ReceivingExpr) {
+  } else if (ReceivingExpr && CheckMoveToConstRef) {
     if ((*InvocationParmType)->isRValueReferenceType())
       return;
 
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to