// RUN: %check_clang_tidy %s performance-noexcept-swap %t -- -- -fexceptions
namespace std
{
template <typename T>
struct is_nothrow_move_constructible
{
static constexpr bool value = __is_nothrow_constructible(T, __add_rvalue_reference(T));
};
} // namespace std
void throwing_function() noexcept(false);
void noexcept_function() noexcept;
template <typename>
struct TemplateNoexceptWithInt {
static void f() {}
};
template <>
struct TemplateNoexceptWithInt<int> {
static void f() noexcept {}
};
class A {
void swap(A &);
// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: swap functions should be marked noexcept [performance-noexcept-swap]
// CHECK-FIXES: void swap(A &) noexcept ;
};
void swap(A &, A &);
// CHECK-MESSAGES: :[[@LINE-1]]:6: warning: swap functions should be marked noexcept [performance-noexcept-swap]
// CHECK-FIXES: void swap(A &, A &) noexcept ;
void iter_swap(A &, A &);
// CHECK-MESSAGES: :[[@LINE-1]]:6: warning: swap functions should be marked noexcept [performance-noexcept-swap]
// CHECK-FIXES: void iter_swap(A &, A &) noexcept ;
struct B {
static constexpr bool kFalse = false;
void swap(B &) noexcept(kFalse);
// CHECK-MESSAGES: :[[@LINE-1]]:27: warning: noexcept specifier on swap function evaluates to 'false' [performance-noexcept-swap]
};
void swap(B &, B &) noexcept(B::kFalse);
// CHECK-MESSAGES: :[[@LINE-1]]:30: warning: noexcept specifier on swap function evaluates to 'false' [performance-noexcept-swap]
template <typename>
struct C {
void swap(C&);
// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: swap functions should be marked noexcept [performance-noexcept-swap]
// CHECK-FIXES: void swap(C&) noexcept ;
};
template <typename T>
void swap(C<T>&, C<T>&);
// CHECK-MESSAGES: :[[@LINE-1]]:6: warning: swap functions should be marked noexcept [performance-noexcept-swap]
// CHECK-FIXES: void swap(C<T>&, C<T>&) noexcept ;
void swap(C<int>&, C<int>&);
// CHECK-MESSAGES: :[[@LINE-1]]:6: warning: swap functions should be marked noexcept [performance-noexcept-swap]
// CHECK-FIXES: void swap(C<int>&, C<int>&) noexcept ;
template <typename>
struct D {
static constexpr bool kFalse = false;
void swap(D &) noexcept(kFalse);
// CHECK-MESSAGES: :[[@LINE-1]]:27: warning: noexcept specifier on swap function evaluates to 'false' [performance-noexcept-swap]
};
void swap(D<int> &, D<int> &) noexcept(D<int>::kFalse);
// CHECK-MESSAGES: :[[@LINE-1]]:40: warning: noexcept specifier on swap function evaluates to 'false' [performance-noexcept-swap]
struct E {
void swap(E &) noexcept(noexcept(throwing_function()));
// CHECK-MESSAGES: :[[@LINE-1]]:27: warning: noexcept specifier on swap function evaluates to 'false' [performance-noexcept-swap]
};
void swap(E &, E &) noexcept(noexcept(throwing_function()));
// CHECK-MESSAGES: :[[@LINE-1]]:30: warning: noexcept specifier on swap function evaluates to 'false' [performance-noexcept-swap]
template <typename>
struct F {
void swap(F &) noexcept(noexcept(throwing_function()));
// CHECK-MESSAGES: :[[@LINE-1]]:27: warning: noexcept specifier on swap function evaluates to 'false' [performance-noexcept-swap]
};
template <typename T>
void swap(F<T> &, F<T> &) noexcept(noexcept(throwing_function()));
// CHECK-MESSAGES: :[[@LINE-1]]:36: warning: noexcept specifier on swap function evaluates to 'false' [performance-noexcept-swap]
void swap(F<int> &, F<int> &) noexcept(noexcept(throwing_function()));
// CHECK-MESSAGES: :[[@LINE-1]]:40: warning: noexcept specifier on swap function evaluates to 'false' [performance-noexcept-swap]
struct G {
void swap(G &) noexcept(noexcept(TemplateNoexceptWithInt<double>::f()));
// CHECK-MESSAGES: :[[@LINE-1]]:27: warning: noexcept specifier on swap function evaluates to 'false' [performance-noexcept-swap]
};
void swap(G &, G &) noexcept(noexcept(TemplateNoexceptWithInt<double>::f()));
// CHECK-MESSAGES: :[[@LINE-1]]:30: warning: noexcept specifier on swap function evaluates to 'false' [performance-noexcept-swap]
class OK {};
struct OK1 {
void swap(OK1 &) noexcept;
};
void swap(OK1 &, OK1 &) noexcept;
struct OK2 {
static constexpr bool kTrue = true;
void swap(OK2 &) noexcept(kTrue) {}
};
void swap(OK2 &, OK2 &) noexcept(OK2::kTrue);
struct OK3 {
void swap(OK3 &) = delete;
};
void swap(OK3 &, OK3 &) = delete;
struct OK4 {
void swap(OK4 &) noexcept(false);
};
void swap(OK4 &, OK4 &) noexcept(false);
struct OK5 {
void swap(OK5 &) noexcept(true);
};
void swap(OK5 &, OK5 &)noexcept(true);
struct OK12 {
void swap(OK12 &) noexcept(noexcept(noexcept_function()));
};
void swap(OK12 &, OK12 &) noexcept(noexcept(noexcept_function()));
struct OK13 {
void swap(OK13 &) noexcept(noexcept(TemplateNoexceptWithInt<int>::f()));
};
void swap(OK13 &, OK13 &) noexcept(noexcept(TemplateNoexceptWithInt<int>::f()));
template <typename>
class OK14 {};
template <typename>
struct OK15 {
void swap(OK15 &) noexcept;
};
template <typename T>
void swap(OK15<T> &, OK15<T> &) noexcept;
void swap(OK15<int> &, OK15<int> &) noexcept;
template <typename>
struct OK16 {
static constexpr bool kTrue = true;
void swap(OK16 &) noexcept(kTrue);
};
template <typename T>
void swap(OK16<T> &, OK16<T> &) noexcept(OK16<T>::kTrue);
template <typename T>
void swap(OK16<int> &, OK16<int> &) noexcept(OK16<int>::kTrue);
template <typename>
struct OK17 {
void swap(OK17 &) = delete;
};
template <typename T>
void swap(OK17<T> &, OK17<T> &) = delete;
void swap(OK17<int> &, OK17<int> &) = delete;
template <typename>
struct OK18 {
void swap(OK18 &) noexcept(false);
};
template <typename T>
void swap(OK18<T> &, OK18<T> &) noexcept(false);
void swap(OK18<int> &, OK18<int> &) noexcept(false);
template <typename>
struct OK19 {
void swap(OK19 &) noexcept(true);
};
template <typename T>
void swap(OK19<T> &, OK19<T> &)noexcept(true);
void swap(OK19<int> &, OK19<int> &)noexcept(true);
template <typename>
struct OK20 {
void swap(OK20 &) noexcept(noexcept(noexcept_function()));
};
template <typename T>
void swap(OK20<T> &, OK20<T> &) noexcept(noexcept(noexcept_function()));
void swap(OK20<int> &, OK20<int> &) noexcept(noexcept(noexcept_function()));
template <typename>
struct OK21 {
void swap(OK21 &) noexcept(noexcept(TemplateNoexceptWithInt<int>::f()));
};
template <typename T>
void swap(OK21<T> &, OK21<T> &) noexcept(noexcept(TemplateNoexceptWithInt<int>::f()));
void swap(OK21<int> &, OK21<int> &) noexcept(noexcept(TemplateNoexceptWithInt<int>::f()));
namespace PR64303 {
void swap();
void swap(int&, bool&);
void swap(int&, int&, int&);
void swap(int&);
struct Test {
void swap();
void swap(Test&, Test&);
void swap(int&);
static void swap(int&, int&);
friend void swap(Test&, Test&);
// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: swap functions should be marked noexcept [performance-noexcept-swap]
};
} // namespace PR64303
namespace gh68101
{
template <typename T>
class Container {
public:
void swap(Container&) noexcept(std::is_nothrow_move_constructible<T>::value);
};
} // namespace gh68101