Fix FN uninitMemberVar with std::array (#4935)
This commit is contained in:
parent
1b00a0f06a
commit
8043930a0f
|
@ -252,8 +252,17 @@ void CheckClass::constructors()
|
||||||
// Check if this is a class constructor
|
// Check if this is a class constructor
|
||||||
if (!var.isPointer() && !var.isPointerArray() && var.isClass() && func.type == Function::eConstructor) {
|
if (!var.isPointer() && !var.isPointerArray() && var.isClass() && func.type == Function::eConstructor) {
|
||||||
// Unknown type so assume it is initialized
|
// Unknown type so assume it is initialized
|
||||||
if (!var.type())
|
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
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Known type that doesn't need initialization or
|
// Known type that doesn't need initialization or
|
||||||
// known type that has member variables of an unknown type
|
// known type that has member variables of an unknown type
|
||||||
|
|
|
@ -194,6 +194,7 @@ private:
|
||||||
TEST_CASE(uninitVarArray7);
|
TEST_CASE(uninitVarArray7);
|
||||||
TEST_CASE(uninitVarArray8);
|
TEST_CASE(uninitVarArray8);
|
||||||
TEST_CASE(uninitVarArray9); // ticket #6957, #6959
|
TEST_CASE(uninitVarArray9); // ticket #6957, #6959
|
||||||
|
TEST_CASE(uninitVarArray10);
|
||||||
TEST_CASE(uninitVarArray2D);
|
TEST_CASE(uninitVarArray2D);
|
||||||
TEST_CASE(uninitVarArray3D);
|
TEST_CASE(uninitVarArray3D);
|
||||||
TEST_CASE(uninitVarCpp11Init1);
|
TEST_CASE(uninitVarCpp11Init1);
|
||||||
|
@ -3117,6 +3118,28 @@ private:
|
||||||
ASSERT_EQUALS("[test.cpp:6]: (warning) Member variable 'sRAIUnitDef::List' is not initialized in the constructor.\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:6]: (warning) Member variable 'sRAIUnitDef::List' is not initialized in the constructor.\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void uninitVarArray10() { // #11650
|
||||||
|
Settings s(settings);
|
||||||
|
LOAD_LIB_2(s.library, "std.cfg");
|
||||||
|
check("struct T { int j; };\n"
|
||||||
|
"struct U { int k{}; };\n"
|
||||||
|
"struct S {\n"
|
||||||
|
" std::array<int, 2> a;\n"
|
||||||
|
" std::array<T, 2> b;\n"
|
||||||
|
" std::array<std::size_t, 2> c;\n"
|
||||||
|
" std::array<clock_t, 2> d;\n"
|
||||||
|
" std::array<std::string, 2> e;\n"
|
||||||
|
" std::array<U, 2> f;\n"
|
||||||
|
"S() {}\n"
|
||||||
|
"};\n", s);
|
||||||
|
|
||||||
|
ASSERT_EQUALS("[test.cpp:10]: (warning) Member variable 'S::a' is not initialized in the constructor.\n"
|
||||||
|
"[test.cpp:10]: (warning) Member variable 'S::b' is not initialized in the constructor.\n"
|
||||||
|
"[test.cpp:10]: (warning) Member variable 'S::c' is not initialized in the constructor.\n"
|
||||||
|
"[test.cpp:10]: (warning) Member variable 'S::d' is not initialized in the constructor.\n",
|
||||||
|
errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
void uninitVarArray2D() {
|
void uninitVarArray2D() {
|
||||||
check("class John\n"
|
check("class John\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
|
|
Loading…
Reference in New Issue