1 // RUN: %check_clang_tidy %s cppcoreguidelines-special-member-functions %t
2 
3 class DefinesDestructor {
4   ~DefinesDestructor();
5 };
6 // CHECK-MESSAGES: [[@LINE-3]]:7: warning: class 'DefinesDestructor' defines a non-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]
7 
8 class 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 
13 class 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 
18 class 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 
23 class 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 
28 class 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]
32 class DefinesNothing {
33 };
34 
35 class DefinesEverything {
36   DefinesEverything(const DefinesEverything &);
37   DefinesEverything &operator=(const DefinesEverything &);
38   DefinesEverything(DefinesEverything &&);
39   DefinesEverything &operator=(DefinesEverything &&);
40   ~DefinesEverything();
41 };
42 
43 class 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 
51 class 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 
59 template <typename T>
60 struct 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.
71 TemplateClass<int> InstantiationWithInt;
72 TemplateClass<double> InstantiationWithDouble;
73