forked from OSchip/llvm-project
219 lines
5.2 KiB
C++
219 lines
5.2 KiB
C++
// RUN: %check_clang_tidy %s readability-convert-member-functions-to-static %t
|
|
|
|
class DoNotMakeEmptyStatic {
|
|
void emptyMethod() {}
|
|
void empty_method_out_of_line();
|
|
};
|
|
|
|
void DoNotMakeEmptyStatic::empty_method_out_of_line() {}
|
|
|
|
class A {
|
|
int field;
|
|
const int const_field;
|
|
static int static_field;
|
|
|
|
void no_use() {
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: method 'no_use' can be made static
|
|
// CHECK-FIXES: {{^}} static void no_use() {
|
|
int i = 1;
|
|
}
|
|
|
|
int read_field() {
|
|
return field;
|
|
}
|
|
|
|
void write_field() {
|
|
field = 1;
|
|
}
|
|
|
|
int call_non_const_member() { return read_field(); }
|
|
|
|
int call_static_member() {
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: method 'call_static_member' can be made static
|
|
// CHECK-FIXES: {{^}} static int call_static_member() {
|
|
already_static();
|
|
}
|
|
|
|
int read_static() {
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: method 'read_static' can be made static
|
|
// CHECK-FIXES: {{^}} static int read_static() {
|
|
return static_field;
|
|
}
|
|
void write_static() {
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: method 'write_static' can be made static
|
|
// CHECK-FIXES: {{^}} static void write_static() {
|
|
static_field = 1;
|
|
}
|
|
|
|
static int already_static() { return static_field; }
|
|
|
|
int already_const() const { return field; }
|
|
|
|
int already_const_convert_to_static() const {
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: method 'already_const_convert_to_static' can be made static
|
|
// CHECK-FIXES: {{^}} static int already_const_convert_to_static() {
|
|
return static_field;
|
|
}
|
|
|
|
static int out_of_line_already_static();
|
|
|
|
void out_of_line_call_static();
|
|
// CHECK-FIXES: {{^}} static void out_of_line_call_static();
|
|
int out_of_line_const_to_static() const;
|
|
// CHECK-FIXES: {{^}} static int out_of_line_const_to_static() ;
|
|
};
|
|
|
|
int A::out_of_line_already_static() { return 0; }
|
|
|
|
void A::out_of_line_call_static() {
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: method 'out_of_line_call_static' can be made static
|
|
// CHECK-FIXES: {{^}}void A::out_of_line_call_static() {
|
|
already_static();
|
|
}
|
|
|
|
int A::out_of_line_const_to_static() const {
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: method 'out_of_line_const_to_static' can be made static
|
|
// CHECK-FIXES: {{^}}int A::out_of_line_const_to_static() {
|
|
return 0;
|
|
}
|
|
|
|
struct KeepVirtual {
|
|
virtual int f() { return 0; }
|
|
virtual int h() const { return 0; }
|
|
};
|
|
|
|
struct KeepVirtualDerived : public KeepVirtual {
|
|
int f() { return 0; }
|
|
int h() const override { return 0; }
|
|
};
|
|
|
|
// Don't add 'static' to special member functions and operators.
|
|
struct KeepSpecial {
|
|
KeepSpecial() { int L = 0; }
|
|
~KeepSpecial() { int L = 0; }
|
|
int operator+() { return 0; }
|
|
operator int() { return 0; }
|
|
};
|
|
|
|
void KeepLambdas() {
|
|
using FT = int (*)();
|
|
auto F = static_cast<FT>([]() { return 0; });
|
|
auto F2 = []() { return 0; };
|
|
}
|
|
|
|
template <class Base>
|
|
struct KeepWithTemplateBase : public Base {
|
|
int i;
|
|
// We cannot make these methods static because they might need to override
|
|
// a function from Base.
|
|
int static_f() { return 0; }
|
|
};
|
|
|
|
template <class T>
|
|
struct KeepTemplateClass {
|
|
int i;
|
|
// We cannot make these methods static because a specialization
|
|
// might use *this differently.
|
|
int static_f() { return 0; }
|
|
};
|
|
|
|
struct KeepTemplateMethod {
|
|
int i;
|
|
// We cannot make these methods static because a specialization
|
|
// might use *this differently.
|
|
template <class T>
|
|
static int static_f() { return 0; }
|
|
};
|
|
|
|
void instantiate() {
|
|
struct S {};
|
|
KeepWithTemplateBase<S> I1;
|
|
I1.static_f();
|
|
|
|
KeepTemplateClass<int> I2;
|
|
I2.static_f();
|
|
|
|
KeepTemplateMethod I3;
|
|
I3.static_f<int>();
|
|
}
|
|
|
|
struct Trailing {
|
|
auto g() const -> int {
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: method 'g' can be made static
|
|
// CHECK-FIXES: {{^}} static auto g() -> int {
|
|
return 0;
|
|
}
|
|
|
|
void vol() volatile {
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: method 'vol' can be made static
|
|
return;
|
|
}
|
|
|
|
void ref() const & {
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: method 'ref' can be made static
|
|
return;
|
|
}
|
|
void refref() const && {
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: method 'refref' can be made static
|
|
return;
|
|
}
|
|
|
|
void restr() __restrict {
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: method 'restr' can be made static
|
|
return;
|
|
}
|
|
};
|
|
|
|
struct UnevaluatedContext {
|
|
void f() { sizeof(this); }
|
|
|
|
void noex() noexcept(noexcept(this));
|
|
};
|
|
|
|
struct LambdaCapturesThis {
|
|
int Field;
|
|
|
|
int explicitCapture() {
|
|
return [this]() { return Field; }();
|
|
}
|
|
|
|
int implicitCapture() {
|
|
return [&]() { return Field; }();
|
|
}
|
|
};
|
|
|
|
struct NoFixitInMacro {
|
|
#define CONST const
|
|
int no_use_macro_const() CONST {
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: method 'no_use_macro_const' can be made static
|
|
return 0;
|
|
}
|
|
|
|
#define ADD_CONST(F) F const
|
|
int ADD_CONST(no_use_macro2()) {
|
|
return 0;
|
|
}
|
|
|
|
#define FUN no_use_macro()
|
|
int i;
|
|
int FUN {
|
|
return i;
|
|
}
|
|
|
|
#define T(FunctionName, Keyword) \
|
|
Keyword int FunctionName() { return 0; }
|
|
#define EMPTY
|
|
T(A, EMPTY)
|
|
T(B, static)
|
|
|
|
#define T2(FunctionName) \
|
|
int FunctionName() { return 0; }
|
|
T2(A2)
|
|
|
|
#define VOLATILE volatile
|
|
void volatileMacro() VOLATILE {
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: method 'volatileMacro' can be made static
|
|
return;
|
|
}
|
|
};
|