Improved parsing of C++11 initializer list (#3956) in CheckClass::initializeVarList.
This commit is contained in:
parent
a93c47988c
commit
37d9d6fd7e
|
@ -236,7 +236,8 @@ bool CheckClass::isBaseClassFunc(const Token *tok, const Scope *scope)
|
||||||
void CheckClass::initializeVarList(const Function &func, std::list<std::string> &callstack, const Scope *scope, std::vector<Usage> &usage)
|
void CheckClass::initializeVarList(const Function &func, std::list<std::string> &callstack, const Scope *scope, std::vector<Usage> &usage)
|
||||||
{
|
{
|
||||||
bool initList = true;
|
bool initList = true;
|
||||||
const Token *ftok = func.arg->link();
|
const Token *ftok = func.arg->link()->next();
|
||||||
|
int level = 0;
|
||||||
|
|
||||||
for (; ftok != func.functionScope->classEnd; ftok = ftok->next()) {
|
for (; ftok != func.functionScope->classEnd; ftok = ftok->next()) {
|
||||||
if (!ftok->next())
|
if (!ftok->next())
|
||||||
|
@ -245,19 +246,22 @@ void CheckClass::initializeVarList(const Function &func, std::list<std::string>
|
||||||
// Class constructor.. initializing variables like this
|
// Class constructor.. initializing variables like this
|
||||||
// clKalle::clKalle() : var(value) { }
|
// clKalle::clKalle() : var(value) { }
|
||||||
if (initList) {
|
if (initList) {
|
||||||
if (Token::Match(ftok, "%var% (")) {
|
if (level == 0 && Token::Match(ftok, "%var% ("))
|
||||||
initVar(ftok->str(), scope, usage);
|
initVar(ftok->str(), scope, usage);
|
||||||
|
else if (level != 0 && Token::Match(ftok, "%var% =")) // assignment in the initializer: var(value = x)
|
||||||
|
assignVar(ftok->str(), scope, usage);
|
||||||
|
|
||||||
// assignment in the initializer..
|
else if (ftok->str() == "(")
|
||||||
// : var(value = x)
|
level++;
|
||||||
if (Token::Match(ftok->tokAt(2), "%var% ="))
|
else if (ftok->str() == ")")
|
||||||
assignVar(ftok->strAt(2), scope, usage);
|
level--;
|
||||||
}
|
else if (ftok->str() == "{") {
|
||||||
}
|
if (level == 0)
|
||||||
|
|
||||||
|
|
||||||
if (ftok->str() == "{")
|
|
||||||
initList = false;
|
initList = false;
|
||||||
|
else
|
||||||
|
ftok = ftok->link();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (initList)
|
if (initList)
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -118,6 +118,7 @@ private:
|
||||||
TEST_CASE(uninitVarArray8);
|
TEST_CASE(uninitVarArray8);
|
||||||
TEST_CASE(uninitVarArray2D);
|
TEST_CASE(uninitVarArray2D);
|
||||||
TEST_CASE(uninitVarArray3D);
|
TEST_CASE(uninitVarArray3D);
|
||||||
|
TEST_CASE(uninitVarCpp11Init);
|
||||||
TEST_CASE(uninitVarStruct1); // ticket #2172
|
TEST_CASE(uninitVarStruct1); // ticket #2172
|
||||||
TEST_CASE(uninitVarStruct2); // ticket #838
|
TEST_CASE(uninitVarStruct2); // ticket #838
|
||||||
TEST_CASE(uninitVarUnion1); // ticket #3196
|
TEST_CASE(uninitVarUnion1); // ticket #3196
|
||||||
|
@ -1694,6 +1695,17 @@ private:
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void uninitVarCpp11Init() {
|
||||||
|
check("class Foo {\n"
|
||||||
|
" std::vector<std::string> bar;\n"
|
||||||
|
"public:\n"
|
||||||
|
" Foo()\n"
|
||||||
|
" : bar({\"a\", \"b\"})\n"
|
||||||
|
" {}\n"
|
||||||
|
"};");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
void uninitVarStruct1() { // ticket #2172
|
void uninitVarStruct1() { // ticket #2172
|
||||||
check("class A\n"
|
check("class A\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
|
|
Loading…
Reference in New Issue