blob: 5461745ac665acef64d9585e072113f8d3a3681c [file] [log] [blame]
Jonathan Coe5d304b22016-07-30 08:58:54 +00001// RUN: %check_clang_tidy %s cppcoreguidelines-special-member-functions %t
2
3class DefinesDestructor {
4 ~DefinesDestructor();
5};
6// CHECK-MESSAGES: [[@LINE-3]]:7: warning: class 'DefinesDestructor' defines a 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
8class DefinesCopyConstructor {
9 DefinesCopyConstructor(const DefinesCopyConstructor &);
10};
11// 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]
12
13class DefinesCopyAssignment {
14 DefinesCopyAssignment &operator=(const DefinesCopyAssignment &);
15};
16// 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]
17
18class DefinesMoveConstructor {
19 DefinesMoveConstructor(DefinesMoveConstructor &&);
20};
21// 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]
22
23class DefinesMoveAssignment {
24 DefinesMoveAssignment &operator=(DefinesMoveAssignment &&);
25};
26// 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]
27class DefinesNothing {
28};
29
30class DefinesEverything {
31 DefinesEverything(const DefinesEverything &);
32 DefinesEverything &operator=(const DefinesEverything &);
33 DefinesEverything(DefinesEverything &&);
34 DefinesEverything &operator=(DefinesEverything &&);
35 ~DefinesEverything();
36};
37
38class DeletesEverything {
39 DeletesEverything(const DeletesEverything &) = delete;
40 DeletesEverything &operator=(const DeletesEverything &) = delete;
41 DeletesEverything(DeletesEverything &&) = delete;
42 DeletesEverything &operator=(DeletesEverything &&) = delete;
43 ~DeletesEverything() = delete;
44};
45
46class DeletesCopyDefaultsMove {
47 DeletesCopyDefaultsMove(const DeletesCopyDefaultsMove &) = delete;
48 DeletesCopyDefaultsMove &operator=(const DeletesCopyDefaultsMove &) = delete;
49 DeletesCopyDefaultsMove(DeletesCopyDefaultsMove &&) = default;
50 DeletesCopyDefaultsMove &operator=(DeletesCopyDefaultsMove &&) = default;
51 ~DeletesCopyDefaultsMove() = default;
52};
Jonathan Coe77ec2632016-08-02 21:18:37 +000053
54template <typename T>
55struct TemplateClass {
56 TemplateClass() = default;
57 TemplateClass(const TemplateClass &);
58 TemplateClass &operator=(const TemplateClass &);
59 TemplateClass(TemplateClass &&);
60 TemplateClass &operator=(TemplateClass &&);
61 ~TemplateClass();
62};
63
64// Multiple instantiations of a class template will trigger multiple matches for defined special members.
65// This should not cause problems.
66TemplateClass<int> InstantiationWithInt;
67TemplateClass<double> InstantiationWithDouble;