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 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]
99struct NonCopyable : NoCopy
100{
101 NonCopyable() = default;
102 NonCopyable(const NonCopyable&) = delete;
103};
104

Provided by KDAB

Privacy Policy
Improve your Profiling and Debugging skills
Find out more

source code of clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/special-member-functions-relaxed.cpp