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. 4 class DeclaresDestructor { 5 ~DeclaresDestructor(); 6 }; 7 8 class DefinesDestructor { 9 ~DefinesDestructor(); 10 }; ~DefinesDestructor()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 14 class DefinesDefaultedDestructor { 15 ~DefinesDefaultedDestructor() = default; 16 }; 17 18 class DefinesDefaultedDestructorOutside { 19 ~DefinesDefaultedDestructorOutside(); 20 }; 21 22 DefinesDefaultedDestructorOutside::~DefinesDefaultedDestructorOutside() = default; 23 24 class 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 29 class 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 34 class 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 39 class 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 44 class DefinesNothing { 45 }; 46 47 class DefinesEverything { 48 DefinesEverything(const DefinesEverything &); 49 DefinesEverything &operator=(const DefinesEverything &); 50 DefinesEverything(DefinesEverything &&); 51 DefinesEverything &operator=(DefinesEverything &&); 52 ~DefinesEverything(); 53 }; 54 55 class 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 63 class 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 71 template <typename T> 72 struct 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. 83 TemplateClass<int> InstantiationWithInt; 84 TemplateClass<double> InstantiationWithDouble; 85 86 struct NoCopy 87 { 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] 99 struct NonCopyable : NoCopy 100 { 101 NonCopyable() = default; 102 NonCopyable(const NonCopyable&) = delete; 103 }; 104