brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.1 KiB · 26142cc Raw
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