diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index b69010bd9..97522c0fb 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -1063,6 +1063,11 @@ void CheckClass::initializeVarList(const Function &func, std::listnext()->varId()); } else if (Token::Match(ftok, "* this . %name% =")) { assignVar(usage, ftok->tokAt(3)->varId()); + } else if (astIsRangeBasedForDecl(ftok)) { + if (const Variable* rangeVar = ftok->astParent()->astOperand1()->variable()) { + if (rangeVar->isReference() && !rangeVar->isConst()) + assignVar(usage, ftok->varId()); + } } // The functions 'clear' and 'Clear' are supposed to initialize variable. diff --git a/test/testconstructors.cpp b/test/testconstructors.cpp index 8101fbfba..77ab92d86 100644 --- a/test/testconstructors.cpp +++ b/test/testconstructors.cpp @@ -193,6 +193,7 @@ private: TEST_CASE(uninitVarArray8); TEST_CASE(uninitVarArray9); // ticket #6957, #6959 TEST_CASE(uninitVarArray10); + TEST_CASE(uninitVarArray11); TEST_CASE(uninitVarArray2D); TEST_CASE(uninitVarArray3D); TEST_CASE(uninitVarCpp11Init1); @@ -3180,6 +3181,20 @@ private: errout.str()); } + void uninitVarArray11() { + check("class C {\n" // #12150 + "private:\n" + " int buf[10];\n" + "public:\n" + " C() {\n" + " for (int& i : buf)\n" + " i = 0;\n" + " }\n" + "};\n"); + + ASSERT_EQUALS("", errout.str()); + } + void uninitVarArray2D() { check("class John\n" "{\n"