// RUN: %check_clang_tidy %s performance-move-const-arg %t \ // RUN: -config='{CheckOptions: \ // RUN: {performance-move-const-arg.CheckMoveToConstRef: false}}' namespace std { template struct remove_reference; template struct remove_reference { typedef _Tp type; }; template struct remove_reference<_Tp &> { typedef _Tp type; }; template struct remove_reference<_Tp &&> { typedef _Tp type; }; template constexpr typename std::remove_reference<_Tp>::type &&move(_Tp &&__t) { return static_cast::type &&>(__t); } template 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)); }