99 lines · cpp
1// RUN: %check_clang_tidy %s cppcoreguidelines-special-member-functions %t2 3class DefinesDestructor {4 ~DefinesDestructor();5};6// CHECK-MESSAGES: [[@LINE-3]]:7: warning: class 'DefinesDestructor' defines a destructor but does not define a copy constructor, a copy assignment operator, a move constructor or a move assignment operator [cppcoreguidelines-special-member-functions]7 8class DefinesDefaultedDestructor {9 ~DefinesDefaultedDestructor() = default;10};11// CHECK-MESSAGES: [[@LINE-3]]:7: warning: class 'DefinesDefaultedDestructor' defines a default destructor but does not define a copy constructor, a copy assignment operator, a move constructor or a move assignment operator [cppcoreguidelines-special-member-functions]12 13class DefinesCopyConstructor {14 DefinesCopyConstructor(const DefinesCopyConstructor &);15};16// CHECK-MESSAGES: [[@LINE-3]]:7: warning: class 'DefinesCopyConstructor' defines a copy constructor but does not define a destructor, a copy assignment operator, a move constructor or a move assignment operator [cppcoreguidelines-special-member-functions]17 18class DefinesCopyAssignment {19 DefinesCopyAssignment &operator=(const DefinesCopyAssignment &);20};21// CHECK-MESSAGES: [[@LINE-3]]:7: warning: class 'DefinesCopyAssignment' defines a copy assignment operator but does not define a destructor, a copy constructor, a move constructor or a move assignment operator [cppcoreguidelines-special-member-functions]22 23class DefinesMoveConstructor {24 DefinesMoveConstructor(DefinesMoveConstructor &&);25};26// CHECK-MESSAGES: [[@LINE-3]]:7: warning: class 'DefinesMoveConstructor' defines a move constructor but does not define a destructor, a copy constructor, a copy assignment operator or a move assignment operator [cppcoreguidelines-special-member-functions]27 28class DefinesMoveAssignment {29 DefinesMoveAssignment &operator=(DefinesMoveAssignment &&);30};31// CHECK-MESSAGES: [[@LINE-3]]:7: warning: class 'DefinesMoveAssignment' defines a move assignment operator but does not define a destructor, a copy constructor, a copy assignment operator or a move constructor [cppcoreguidelines-special-member-functions]32class DefinesNothing {33};34 35class DefinesEverything {36 DefinesEverything(const DefinesEverything &);37 DefinesEverything &operator=(const DefinesEverything &);38 DefinesEverything(DefinesEverything &&);39 DefinesEverything &operator=(DefinesEverything &&);40 ~DefinesEverything();41};42 43class DeletesEverything {44 DeletesEverything(const DeletesEverything &) = delete;45 DeletesEverything &operator=(const DeletesEverything &) = delete;46 DeletesEverything(DeletesEverything &&) = delete;47 DeletesEverything &operator=(DeletesEverything &&) = delete;48 ~DeletesEverything() = delete;49};50 51class DeletesCopyDefaultsMove {52 DeletesCopyDefaultsMove(const DeletesCopyDefaultsMove &) = delete;53 DeletesCopyDefaultsMove &operator=(const DeletesCopyDefaultsMove &) = delete;54 DeletesCopyDefaultsMove(DeletesCopyDefaultsMove &&) = default;55 DeletesCopyDefaultsMove &operator=(DeletesCopyDefaultsMove &&) = default;56 ~DeletesCopyDefaultsMove() = default;57};58 59template <typename T>60struct TemplateClass {61 TemplateClass() = default;62 TemplateClass(const TemplateClass &);63 TemplateClass &operator=(const TemplateClass &);64 TemplateClass(TemplateClass &&);65 TemplateClass &operator=(TemplateClass &&);66 ~TemplateClass();67};68 69// Multiple instantiations of a class template will trigger multiple matches for defined special members.70// This should not cause problems.71TemplateClass<int> InstantiationWithInt;72TemplateClass<double> InstantiationWithDouble;73 74#define DEFINE_DESTRUCTOR_ONLY(ClassName) \75 class ClassName { \76 ~ClassName(); \77 };78 79#define DEFINE_COPY_CTOR_ONLY(ClassName) \80 class ClassName { \81 ClassName(const ClassName &); \82 };83 84#define DEFINE_CLASS_WITH_DTOR(ClassName) \85 class ClassName { \86 ~ClassName(); \87 };88 89DEFINE_DESTRUCTOR_ONLY(MacroDefinedClass1)90DEFINE_COPY_CTOR_ONLY(MacroDefinedClass2)91DEFINE_CLASS_WITH_DTOR(MacroDefinedClass3)92 93// Test partial macro expansion94#define CLASS_NAME MacroNamedClass95class CLASS_NAME {96 ~MacroNamedClass();97};98// CHECK-MESSAGES: [[@LINE-3]]:7: warning: class 'MacroNamedClass' defines a destructor but does not define a copy constructor, a copy assignment operator, a move constructor or a move assignment operator99