104 lines · cpp
1// RUN: %check_clang_tidy %s cppcoreguidelines-special-member-functions %t -- -config="{CheckOptions: {cppcoreguidelines-special-member-functions.AllowMissingMoveFunctions: true, cppcoreguidelines-special-member-functions.AllowSoleDefaultDtor: true, cppcoreguidelines-special-member-functions.AllowImplicitlyDeletedCopyOrMove: true}}" --2 3// Don't warn on destructors without definitions, they might be defaulted in another TU.4class DeclaresDestructor {5 ~DeclaresDestructor();6};7 8class DefinesDestructor {9 ~DefinesDestructor();10};11DefinesDestructor::~DefinesDestructor() {}12// CHECK-MESSAGES: [[@LINE-4]]:7: warning: class 'DefinesDestructor' defines a non-default destructor but does not define a copy constructor or a copy assignment operator [cppcoreguidelines-special-member-functions]13 14class DefinesDefaultedDestructor {15 ~DefinesDefaultedDestructor() = default;16};17 18class DefinesDefaultedDestructorOutside {19 ~DefinesDefaultedDestructorOutside();20};21 22DefinesDefaultedDestructorOutside::~DefinesDefaultedDestructorOutside() = default;23 24class DefinesCopyConstructor {25 DefinesCopyConstructor(const DefinesCopyConstructor &);26};27// CHECK-MESSAGES: [[@LINE-3]]:7: warning: class 'DefinesCopyConstructor' defines a copy constructor but does not define a destructor or a copy assignment operator [cppcoreguidelines-special-member-functions]28 29class DefinesCopyAssignment {30 DefinesCopyAssignment &operator=(const DefinesCopyAssignment &);31};32// CHECK-MESSAGES: [[@LINE-3]]:7: warning: class 'DefinesCopyAssignment' defines a copy assignment operator but does not define a destructor or a copy constructor [cppcoreguidelines-special-member-functions]33 34class DefinesMoveConstructor {35 DefinesMoveConstructor(DefinesMoveConstructor &&);36};37// CHECK-MESSAGES: [[@LINE-3]]:7: warning: class 'DefinesMoveConstructor' defines a move constructor but does not define a destructor or a move assignment operator [cppcoreguidelines-special-member-functions]38 39class DefinesMoveAssignment {40 DefinesMoveAssignment &operator=(DefinesMoveAssignment &&);41};42// CHECK-MESSAGES: [[@LINE-3]]:7: warning: class 'DefinesMoveAssignment' defines a move assignment operator but does not define a destructor or a move constructor [cppcoreguidelines-special-member-functions]43 44class DefinesNothing {45};46 47class DefinesEverything {48 DefinesEverything(const DefinesEverything &);49 DefinesEverything &operator=(const DefinesEverything &);50 DefinesEverything(DefinesEverything &&);51 DefinesEverything &operator=(DefinesEverything &&);52 ~DefinesEverything();53};54 55class DeletesEverything {56 DeletesEverything(const DeletesEverything &) = delete;57 DeletesEverything &operator=(const DeletesEverything &) = delete;58 DeletesEverything(DeletesEverything &&) = delete;59 DeletesEverything &operator=(DeletesEverything &&) = delete;60 ~DeletesEverything() = delete;61};62 63class DeletesCopyDefaultsMove {64 DeletesCopyDefaultsMove(const DeletesCopyDefaultsMove &) = delete;65 DeletesCopyDefaultsMove &operator=(const DeletesCopyDefaultsMove &) = delete;66 DeletesCopyDefaultsMove(DeletesCopyDefaultsMove &&) = default;67 DeletesCopyDefaultsMove &operator=(DeletesCopyDefaultsMove &&) = default;68 ~DeletesCopyDefaultsMove() = default;69};70 71template <typename T>72struct TemplateClass {73 TemplateClass() = default;74 TemplateClass(const TemplateClass &);75 TemplateClass &operator=(const TemplateClass &);76 TemplateClass(TemplateClass &&);77 TemplateClass &operator=(TemplateClass &&);78 ~TemplateClass();79};80 81// Multiple instantiations of a class template will trigger multiple matches for defined special members.82// This should not cause problems.83TemplateClass<int> InstantiationWithInt;84TemplateClass<double> InstantiationWithDouble;85 86struct NoCopy87{88 NoCopy() = default;89 ~NoCopy() = default;90 91 NoCopy(const NoCopy&) = delete;92 NoCopy(NoCopy&&) = delete;93 94 NoCopy& operator=(const NoCopy&) = delete;95 NoCopy& operator=(NoCopy&&) = delete;96};97 98// CHECK-MESSAGES: [[@LINE+1]]:8: warning: class 'NonCopyable' defines a copy constructor but does not define a destructor or a copy assignment operator [cppcoreguidelines-special-member-functions]99struct NonCopyable : NoCopy100{101 NonCopyable() = default;102 NonCopyable(const NonCopyable&) = delete;103};104