238 lines
6.9 KiB
C++
238 lines
6.9 KiB
C++
// 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
|