More general fix to #4187 (False positive: Variable inside a lambda is reported as uninitialized)
This commit is contained in:
parent
d387e8b770
commit
511f8a4c1f
|
@ -4978,14 +4978,17 @@ static void incdec(std::string &value, const std::string &op)
|
||||||
value = ostr.str();
|
value = ostr.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Tokenizer::simplifyVarDecl(bool only_k_r_fpar)
|
void Tokenizer::simplifyVarDecl(bool only_k_r_fpar)
|
||||||
|
{
|
||||||
|
simplifyVarDecl(list.front(), NULL, only_k_r_fpar);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Tokenizer::simplifyVarDecl(Token * tokBegin, Token * tokEnd, bool only_k_r_fpar)
|
||||||
{
|
{
|
||||||
// Split up variable declarations..
|
// Split up variable declarations..
|
||||||
// "int a=4;" => "int a; a=4;"
|
// "int a=4;" => "int a; a=4;"
|
||||||
bool finishedwithkr = true;
|
bool finishedwithkr = true;
|
||||||
for (Token *tok = list.front(); tok; tok = tok->next()) {
|
for (Token *tok = tokBegin; tok != tokEnd; tok = tok->next()) {
|
||||||
if (Token::simpleMatch(tok, "= {")) {
|
if (Token::simpleMatch(tok, "= {")) {
|
||||||
tok = tok->next()->link();
|
tok = tok->next()->link();
|
||||||
}
|
}
|
||||||
|
@ -5000,11 +5003,16 @@ void Tokenizer::simplifyVarDecl(bool only_k_r_fpar)
|
||||||
} else
|
} else
|
||||||
continue;
|
continue;
|
||||||
} else if (tok->str() == "(") {
|
} else if (tok->str() == "(") {
|
||||||
|
for (Token * tok2 = tok; tok2 != tok->link(); tok2 = tok2->next()) {
|
||||||
|
if (isCPP() && Token::Match(tok2, "[(,] [")) {
|
||||||
|
// lambda function at tok2->next()
|
||||||
|
// find start of lambda body
|
||||||
|
Token * lambdaBody = Token::findsimplematch(tok2, "{", tok->link());
|
||||||
|
if (lambdaBody && lambdaBody->link())
|
||||||
|
simplifyVarDecl(lambdaBody, lambdaBody->link(), only_k_r_fpar);
|
||||||
|
}
|
||||||
|
}
|
||||||
tok = tok->link();
|
tok = tok->link();
|
||||||
|
|
||||||
// TestTokenizer::vardecl24 - lambda functions..
|
|
||||||
if (isCPP() && tok->previous()->str() == "}")
|
|
||||||
tok = tok->previous()->link();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tok->previous() && !Token::Match(tok->previous(), "{|}|;|)|public:|protected:|private:"))
|
if (tok->previous() && !Token::Match(tok->previous(), "{|}|;|)|public:|protected:|private:"))
|
||||||
|
|
|
@ -208,6 +208,7 @@ public:
|
||||||
* \param only_k_r_fpar Only simplify K&R function parameters
|
* \param only_k_r_fpar Only simplify K&R function parameters
|
||||||
*/
|
*/
|
||||||
void simplifyVarDecl(bool only_k_r_fpar);
|
void simplifyVarDecl(bool only_k_r_fpar);
|
||||||
|
void simplifyVarDecl(Token * tokBegin, Token * tokEnd, bool only_k_r_fpar);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Simplify variable initialization
|
* Simplify variable initialization
|
||||||
|
|
|
@ -5730,21 +5730,31 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
void vardecl24() { // #4187 - variable declaration within lambda function
|
void vardecl24() { // #4187 - variable declaration within lambda function
|
||||||
const char code[] = "void f() {\n"
|
const char code1[] = "void f() {\n"
|
||||||
" std::for_each(ints.begin(), ints.end(), [](int val)\n"
|
" std::for_each(ints.begin(), ints.end(), [](int val)\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" int temp = 0;\n"
|
" int temp = 0;\n"
|
||||||
" });\n"
|
" });\n"
|
||||||
"}";
|
"}";
|
||||||
|
|
||||||
const char expected[] = "void f ( ) {\n"
|
const char expected1[] = "void f ( ) {\n"
|
||||||
"std :: for_each ( ints . begin ( ) , ints . end ( ) , [ ] ( int val )\n"
|
"std :: for_each ( ints . begin ( ) , ints . end ( ) , [ ] ( int val )\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
"int temp ; temp = 0 ;\n"
|
"int temp ; temp = 0 ;\n"
|
||||||
"} ) ;\n"
|
"} ) ;\n"
|
||||||
"}";
|
"}";
|
||||||
|
|
||||||
ASSERT_EQUALS(expected, tokenizeAndStringify(code));
|
ASSERT_EQUALS(expected1, tokenizeAndStringify(code1));
|
||||||
|
|
||||||
|
const char code2[] = "void f(int j) {\n"
|
||||||
|
" g( [](){int temp = 0;} , j );\n"
|
||||||
|
"}";
|
||||||
|
|
||||||
|
const char expected2[] = "void f ( int j ) {\n"
|
||||||
|
"g ( [ ] ( ) { int temp ; temp = 0 ; } , j ) ;\n"
|
||||||
|
"}";
|
||||||
|
|
||||||
|
ASSERT_EQUALS(expected2, tokenizeAndStringify(code2));
|
||||||
}
|
}
|
||||||
|
|
||||||
void volatile_variables() {
|
void volatile_variables() {
|
||||||
|
|
Loading…
Reference in New Issue