diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index 8a12a3e2f66..e4989ba4376 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -244,11 +244,19 @@ void CheckClass::constructors() if (!var.isPointer() && !var.isPointerArray() && var.isClass() && func.type == FunctionType::eConstructor) { // Unknown type so assume it is initialized if (!var.type()) { - if (var.isStlType() && var.valueType() && var.valueType()->containerTypeToken && var.getTypeName() == "std::array") { - const Token* ctt = var.valueType()->containerTypeToken; - if (!ctt->isStandardType() && - (!ctt->type() || ctt->type()->needInitialization != Type::NeedInitialization::True) && - !mSettings->library.podtype(ctt->str())) // TODO: handle complex type expression + if (var.isStlType() && var.valueType() && var.valueType()->containerTypeToken) { + if (var.valueType()->type == ValueType::Type::ITERATOR) + { + // needs initialization + } + else if (var.getTypeName() == "std::array") { + const Token* ctt = var.valueType()->containerTypeToken; + if (!ctt->isStandardType() && + (!ctt->type() || ctt->type()->needInitialization != Type::NeedInitialization::True) && + !mSettings->library.podtype(ctt->str())) // TODO: handle complex type expression + continue; + } + else continue; } else diff --git a/test/testconstructors.cpp b/test/testconstructors.cpp index 39de3b1cf1d..8023990f629 100644 --- a/test/testconstructors.cpp +++ b/test/testconstructors.cpp @@ -173,6 +173,7 @@ class TestConstructors : public TestFixture { TEST_CASE(uninitVar34); // ticket #10841 TEST_CASE(uninitVar35); TEST_CASE(uninitVar36); + TEST_CASE(uninitVar37); TEST_CASE(uninitVarEnum1); TEST_CASE(uninitVarEnum2); // ticket #8146 TEST_CASE(uninitVarStream); @@ -3031,6 +3032,15 @@ class TestConstructors : public TestFixture { ASSERT_EQUALS("[test.cpp:5:5]: (warning) Member variable 'S::b' is not initialized in the constructor. [uninitMemberVar]\n", errout_str()); } + void uninitVar37() { + const Settings s = settingsBuilder(settings).library("std.cfg").build(); + check("struct C {\n" // #13989 + " C() = default;\n" + " std::list::const_iterator it;\n" + "};\n", dinit(CheckOptions, $.s = &s)); + ASSERT_EQUALS("[test.cpp:2:5]: (warning) Member variable 'C::it' is not initialized in the constructor. [uninitMemberVar]\n", errout_str()); + } + void uninitVarArray1() { check("class John\n" "{\n"