brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.2 KiB · 28b515f Raw
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