1 // RUN: %check_clang_tidy %s performance-noexcept-move-constructor %t 2 3 class A { 4 A(A &&); 5 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: move constructors should be marked noexcept [performance-noexcept-move-constructor] 6 A &operator=(A &&); 7 // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: move assignment operators should 8 }; 9 10 struct B { 11 static constexpr bool kFalse = false; 12 B(B &&) noexcept(kFalse); 13 // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: noexcept specifier on the move constructor evaluates to 'false' [performance-noexcept-move-constructor] 14 }; 15 16 class OK {}; 17 f()18void f() { 19 OK a; 20 a = OK(); 21 } 22 23 class OK1 { 24 public: 25 OK1(); 26 OK1(const OK1 &); 27 OK1(OK1 &&) noexcept; 28 OK1 &operator=(OK1 &&) noexcept; 29 void f(); 30 void g() noexcept; 31 }; 32 33 class OK2 { 34 static constexpr bool kTrue = true; 35 36 public: OK2(OK2 &&)37 OK2(OK2 &&) noexcept(true) {} operator =(OK2 &&)38 OK2 &operator=(OK2 &&) noexcept(kTrue) { return *this; } 39 }; 40 41 struct OK3 { OK3OK342 OK3(OK3 &&) noexcept(false) {} 43 OK3 &operator=(OK3 &&) = delete; 44 }; 45 46 struct OK4 { 47 OK4(OK4 &&) noexcept = default; 48 OK4 &operator=(OK4 &&) noexcept = default; 49 }; 50 51 struct OK5 { 52 OK5(OK5 &&) noexcept(true) = default; 53 OK5 &operator=(OK5 &&) noexcept(true) = default; 54 }; 55