Skip to content

Commit 44461e1

Browse files
committed
Fix
1 parent 2e69413 commit 44461e1

2 files changed

Lines changed: 26 additions & 7 deletions

File tree

lib/checkclass.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -352,14 +352,15 @@ void CheckClass::constructors()
352352
// Variables with default initializers
353353
bool hasAnyDefaultInit = false;
354354
bool hasAnySelfInit = false;
355+
const bool cpp14OrLater = mSettings->standards.cpp >= Standards::CPP14;
355356
for (Usage& usage : usageList) {
356357
const Variable& var = *usage.var;
357358

358359
// check for C++11 initializer
359360
if (var.hasDefault()) {
360361
usage.init = true;
361362
hasAnyDefaultInit = true;
362-
} else if (!hasAnySelfInit && isInitialized(usage, FunctionType::eConstructor)) {
363+
} else if (cpp14OrLater && !hasAnySelfInit && isInitialized(usage, FunctionType::eConstructor)) {
363364
hasAnySelfInit = true;
364365
}
365366
}
@@ -374,6 +375,9 @@ void CheckClass::constructors()
374375
continue;
375376

376377
const Variable& var = *usage.var;
378+
if (var.typeScope() && var.typeScope()->numConstructors > 0)
379+
continue;
380+
377381
if (diagVars.count(&var) == 0)
378382
uninitVarError(var.nameToken(), false, FunctionType::eConstructor, var.scope()->className, var.name(), false, false, true);
379383
}

test/testconstructors.cpp

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -770,15 +770,30 @@ class TestConstructors : public TestFixture {
770770
"};\n");
771771
ASSERT_EQUALS("", errout_str());
772772

773-
check("struct S { int i = 0; };\n" // #14697
773+
check("struct S {\n"
774+
" explicit S(int);\n"
775+
" S(const S&);\n"
776+
" int i;\n"
777+
"};\n"
774778
"struct T {\n"
775779
" S s;\n"
776-
" int j;\n"
777-
"};\n"
778-
"struct U {\n"
779-
" std::string a;\n"
780-
" int k;\n"
780+
" int j{};\n"
781781
"};\n");
782+
ASSERT_EQUALS("", errout_str());
783+
784+
const char code[] = "struct S { int i = 0; };\n" // #14697
785+
"struct T {\n"
786+
" S s;\n"
787+
" int j;\n"
788+
"};\n"
789+
"struct U {\n"
790+
" std::string a;\n"
791+
" int k;\n"
792+
"};\n";
793+
const Settings s = settingsBuilder(settings).cpp(Standards::CPP11).build();
794+
check(code, s);
795+
ASSERT_EQUALS("", errout_str());
796+
check(code);
782797
ASSERT_EQUALS("[test.cpp:4:9]: (warning) Member variable 'T::j' has no initializer. [uninitMemberVarNoCtor]\n"
783798
"[test.cpp:8:9]: (warning) Member variable 'U::k' has no initializer. [uninitMemberVarNoCtor]\n",
784799
errout_str());

0 commit comments

Comments
 (0)