-
Notifications
You must be signed in to change notification settings - Fork 61
/
Copy pathtest.cpp
143 lines (125 loc) · 4.94 KB
/
test.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
// Base class with public move/copy is not compliant
class BaseClass1 {
public:
BaseClass1(BaseClass1 const &) = default; // NON_COMPLIANT
BaseClass1(BaseClass1 &&) = default; // NON_COMPLIANT
BaseClass1 &operator=(BaseClass1 const &) = default; // NON_COMPLIANT
BaseClass1 &operator=(BaseClass1 &&) = default; // NON_COMPLIANT
int operator=(int i); // COMPLIANT - not an assignment operator
};
class DerivedClass1 // COMPLIANT - not a base class itself
: public BaseClass1 {};
// Base class with compiler generated move/copy is not compliant, because they
// are public by default
class BaseClass2 {}; // NON_COMPLIANT - compiler generated move and assignment
// are in contravention
class DerivedClass2 // COMPLIANT - not a base class itself
: public BaseClass2 {};
class BaseClass3 {
protected:
BaseClass3(BaseClass3 const &) = default; // COMPLIANT - protected
BaseClass3(BaseClass3 &&) = default; // COMPLIANT - protected
BaseClass3 &operator=(BaseClass3 const &) = default; // COMPLIANT - protected
BaseClass3 &operator=(BaseClass3 &&) = default; // COMPLIANT - protected
};
class DerivedClass3 // COMPLIANT - not a base class itself
: public BaseClass3 {};
class BaseClass4 {
public:
BaseClass4(BaseClass4 const &) = delete; // COMPLIANT - deleted
BaseClass4(BaseClass4 &&) = delete; // COMPLIANT - deleted
BaseClass4 &operator=(BaseClass4 const &) = delete; // COMPLIANT - deleted
BaseClass4 &operator=(BaseClass4 &&) = delete; // COMPLIANT - deleted
};
class DerivedClass4
: public BaseClass4 { // COMPLIANT - no compiler generated move/copy
};
class NonBaseClass1 { // Not a base class, so fine to be public
public:
NonBaseClass1(NonBaseClass1 const &) = default; // COMPLIANT
NonBaseClass1(NonBaseClass1 &&) = default; // COMPLIANT
NonBaseClass1 &operator=(NonBaseClass1 const &) = default; // COMPLIANT
NonBaseClass1 &operator=(NonBaseClass1 &&) = default; // COMPLIANT
};
class NonBaseClass2 {}; // COMPLIANT - move/copy is compiler
// generated, but this is not a base class
// A class where the definitions of the move/copy are external to the class body
class BaseClass5 {
public:
BaseClass5(BaseClass5 const &); // NON_COMPLIANT
BaseClass5(BaseClass5 &&); // NON_COMPLIANT
BaseClass5 &operator=(BaseClass5 const &); // NON_COMPLIANT
BaseClass5 &operator=(BaseClass5 &&); // NON_COMPLIANT
private:
int x;
};
class DerivedClass5 // COMPLIANT - not a base class itself
: public BaseClass5 {};
// We do not want to flag the definitions here - instead, we flag the
// declarations in the class body
BaseClass5::BaseClass5(BaseClass5 const &) {}
BaseClass5::BaseClass5(BaseClass5 &&) {}
BaseClass5 &BaseClass5::operator=(BaseClass5 const &other) { return *this; }
BaseClass5 &BaseClass5::operator=(BaseClass5 &&other) { return *this; }
// Abstract class assumed to be base class even without a derivation
class BaseClass6 {
public:
BaseClass6(BaseClass6 const &) = default; // NON_COMPLIANT
BaseClass6(BaseClass6 &&) = default; // NON_COMPLIANT
BaseClass6 &operator=(BaseClass6 const &) = default; // NON_COMPLIANT
BaseClass6 &operator=(BaseClass6 &&) = default; // NON_COMPLIANT
virtual void test() = 0; // pure virtual function, making this abstract
};
template <class T1> class BaseClass7 {
public:
BaseClass7() {}
BaseClass7(BaseClass7 const &) = default; // NON_COMPLIANT
BaseClass7(BaseClass7 &&) = default; // NON_COMPLIANT
BaseClass7 &operator=(BaseClass7 const &) = default; // NON_COMPLIANT
BaseClass7 &operator=(BaseClass7 &&) = default; // NON_COMPLIANT
int operator=(int i); // COMPLIANT - not an assignment operator
}; // COMPLIANT
template <class T>
class DerivedClass7 // COMPLIANT - not a base class itself
: public BaseClass7<T> {
public:
DerivedClass7() {}
};
class DerivedClass8 // COMPLIANT - not a base class itself
: public BaseClass7<int> {
public:
DerivedClass8() {}
};
class BaseClass8 {
public:
BaseClass8() {}
BaseClass8(BaseClass8 const &) = default; // NON_COMPLIANT
BaseClass8(BaseClass8 &&) = default; // NON_COMPLIANT
BaseClass8 &operator=(BaseClass8 const &) = default; // NON_COMPLIANT
BaseClass8 &operator=(BaseClass8 &&) = default; // NON_COMPLIANT
};
template <class T>
class DerivedClass9 // COMPLIANT - not a base class itself
: public BaseClass8 {
public:
DerivedClass9() {}
private:
T t;
};
template <class T> class BaseClass9 { // NON_COMPLIANT
public:
BaseClass9() {}
};
template <class T>
class DerivedClass10 // COMPLIANT - not a base class itself
: public BaseClass9<T> {
public:
DerivedClass10() {}
};
void test() {
BaseClass7<int> b;
DerivedClass7<int> d;
DerivedClass9<int> e;
BaseClass9<int> f;
DerivedClass10<int> g;
}