Skip to content

Commit a3eb725

Browse files
committed
Support C++03-style of declaring a copy ctor as deleted (cppcheck-opensource#6585)
1 parent e8ac4d8 commit a3eb725

2 files changed

Lines changed: 42 additions & 35 deletions

File tree

lib/checkclass.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ void CheckClass::checkExplicitConstructors()
248248
// 2) Constructor is not declared as explicit
249249
// 3) It is not a copy/move constructor of non-abstract class
250250
// 4) Constructor is not marked as delete (programmer can mark the default constructor as deleted, which is ok)
251-
if (!func->isConstructor() || func->isDelete())
251+
if (!func->isConstructor() || func->isDelete() || (!func->hasBody() && func->access == Private))
252252
continue;
253253

254254
if (!func->isExplicit() && func->argCount() == 1) {

test/testclass.cpp

Lines changed: 41 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -198,54 +198,61 @@ class TestClass : public TestFixture {
198198
}
199199

200200
void explicitConstructors() {
201-
checkExplicitConstructors("class Class \n"
202-
"{ \n"
203-
" Class() = delete; \n"
204-
" Class(const Class& other) { } \n"
205-
" Class(Class&& other) { } \n"
206-
" explicit Class(int i) { } \n"
207-
" explicit Class(const std::string&) { } \n"
208-
" Class(int a, int b) { } \n"
201+
checkExplicitConstructors("class Class {\n"
202+
" Class() = delete;\n"
203+
" Class(const Class& other) { }\n"
204+
" Class(Class&& other) { }\n"
205+
" explicit Class(int i) { }\n"
206+
" explicit Class(const std::string&) { }\n"
207+
" Class(int a, int b) { }\n"
209208
"};");
210209
ASSERT_EQUALS("", errout.str());
211210

212-
checkExplicitConstructors("class Class \n"
213-
"{ \n"
214-
" Class() = delete; \n"
215-
" explicit Class(const Class& other) { } \n"
216-
" explicit Class(Class&& other) { } \n"
217-
" virtual int i() = 0; \n"
211+
checkExplicitConstructors("class Class {\n"
212+
" Class() = delete;\n"
213+
" explicit Class(const Class& other) { }\n"
214+
" explicit Class(Class&& other) { }\n"
215+
" virtual int i() = 0;\n"
218216
"};");
219217
ASSERT_EQUALS("", errout.str());
220218

221-
checkExplicitConstructors("class Class \n"
222-
"{ \n"
223-
" Class() = delete; \n"
224-
" Class(const Class& other) = delete; \n"
225-
" Class(Class&& other) = delete; \n"
226-
" virtual int i() = 0; \n"
219+
checkExplicitConstructors("class Class {\n"
220+
" Class() = delete;\n"
221+
" Class(const Class& other) = delete;\n"
222+
" Class(Class&& other) = delete;\n"
223+
" virtual int i() = 0;\n"
227224
"};");
228225
ASSERT_EQUALS("", errout.str());
229226

230-
checkExplicitConstructors("class Class \n"
231-
"{ \n"
232-
" Class(int i) { } \n"
227+
checkExplicitConstructors("class Class {\n"
228+
" Class(int i) { }\n"
233229
"};");
234-
ASSERT_EQUALS("[test.cpp:3]: (style) Class 'Class' has a constructor with 1 argument that is not explicit.\n", errout.str());
230+
ASSERT_EQUALS("[test.cpp:2]: (style) Class 'Class' has a constructor with 1 argument that is not explicit.\n", errout.str());
235231

236-
checkExplicitConstructors("class Class \n"
237-
"{ \n"
238-
" Class(const Class& other) { } \n"
239-
" virtual int i() = 0; \n"
232+
checkExplicitConstructors("class Class {\n"
233+
" Class(const Class& other) { }\n"
234+
" virtual int i() = 0;\n"
240235
"};");
241-
ASSERT_EQUALS("[test.cpp:3]: (style) Abstract class 'Class' has a copy/move constructor that is not explicit.\n", errout.str());
236+
ASSERT_EQUALS("[test.cpp:2]: (style) Abstract class 'Class' has a copy/move constructor that is not explicit.\n", errout.str());
242237

243-
checkExplicitConstructors("class Class \n"
244-
"{ \n"
245-
" Class(Class&& other) { } \n"
246-
" virtual int i() = 0; \n"
238+
checkExplicitConstructors("class Class {\n"
239+
" Class(Class&& other) { }\n"
240+
" virtual int i() = 0;\n"
247241
"};");
248-
ASSERT_EQUALS("[test.cpp:3]: (style) Abstract class 'Class' has a copy/move constructor that is not explicit.\n", errout.str());
242+
ASSERT_EQUALS("[test.cpp:2]: (style) Abstract class 'Class' has a copy/move constructor that is not explicit.\n", errout.str());
243+
244+
// #6585
245+
checkExplicitConstructors("class Class {\n"
246+
" private: Class(const Class&);\n"
247+
" virtual int i() = 0;\n"
248+
"};");
249+
ASSERT_EQUALS("", errout.str());
250+
251+
checkExplicitConstructors("class Class {\n"
252+
" public: Class(const Class&);\n"
253+
" virtual int i() = 0;\n"
254+
"};");
255+
ASSERT_EQUALS("[test.cpp:2]: (style) Abstract class 'Class' has a copy/move constructor that is not explicit.\n", errout.str());
249256
}
250257

251258
void checkDuplInheritedMembers(const char code[]) {

0 commit comments

Comments
 (0)