Fixed false positive #6787: Skip over lambdas in CheckAutoVariables::returnReference()

This commit is contained in:
PKEuS 2015-08-14 13:03:07 +02:00
parent b0bf69bae7
commit a297a03b64
2 changed files with 15 additions and 0 deletions

View File

@ -399,6 +399,10 @@ void CheckAutoVariables::returnReference()
// have we reached a function that returns a reference?
if (tok->previous() && tok->previous()->str() == "&") {
for (const Token *tok2 = scope->classStart->next(); tok2 && tok2 != scope->classEnd; tok2 = tok2->next()) {
// Skip over lambdas
if (tok2->str() == "[" && tok2->link()->strAt(1) == "(" && tok2->link()->linkAt(1)->strAt(1) == "{")
tok2 = tok2->link()->linkAt(1)->linkAt(1);
if (tok2->str() != "return")
continue;

View File

@ -98,6 +98,7 @@ private:
TEST_CASE(returnReference7);
TEST_CASE(returnReferenceLiteral);
TEST_CASE(returnReferenceCalculation);
TEST_CASE(returnReferenceLambda);
// global namespace
TEST_CASE(testglobalnamespace);
@ -954,6 +955,16 @@ private:
ASSERT_EQUALS("", errout.str());
}
void returnReferenceLambda() {
// #6787
check("const Item& foo(const Container& items) const {\n"
" return bar(items.begin(), items.end(),\n"
" [](const Item& lhs, const Item& rhs) {\n"
" return false;\n"
" });\n"
"}");
ASSERT_EQUALS("", errout.str());
}
void testglobalnamespace() {
check("class SharedPtrHolder\n"