Skip to content

Commit 8da4e31

Browse files
committed
Fixed #8941 (False Positive: Variable 'f' is assigned a value that is never used.)
1 parent 0f19dfe commit 8da4e31

2 files changed

Lines changed: 24 additions & 2 deletions

File tree

lib/token.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
#include "token.h"
2020

21+
#include "astutils.h"
2122
#include "errorlogger.h"
2223
#include "library.h"
2324
#include "settings.h"
@@ -1173,20 +1174,32 @@ static const Token* goToRightParenthesis(const Token* start, const Token* end)
11731174
std::pair<const Token *, const Token *> Token::findExpressionStartEndTokens() const
11741175
{
11751176
const Token * const top = this;
1177+
1178+
// find start node in AST tree
11761179
const Token *start = top;
11771180
while (start->astOperand1() &&
11781181
(start->astOperand2() || !start->isUnaryPreOp() || Token::simpleMatch(start, "( )") || start->str() == "{"))
11791182
start = start->astOperand1();
1183+
1184+
// find end node in AST tree
11801185
const Token *end = top;
11811186
while (end->astOperand1() && (end->astOperand2() || end->isUnaryPreOp())) {
1182-
if (Token::Match(end,"(|[") &&
1183-
!(Token::Match(end, "( %type%") && !end->astOperand2())) {
1187+
// lambda..
1188+
if (end->str() == "[") {
1189+
const Token *lambdaEnd = findLambdaEndToken(end);
1190+
if (lambdaEnd) {
1191+
end = lambdaEnd;
1192+
break;
1193+
}
1194+
} else if (Token::Match(end,"(|[") &&
1195+
!(Token::Match(end, "( %type%") && !end->astOperand2())) {
11841196
end = end->link();
11851197
break;
11861198
}
11871199
end = end->astOperand2() ? end->astOperand2() : end->astOperand1();
11881200
}
11891201

1202+
// skip parentheses
11901203
start = goToLeftParenthesis(start, end);
11911204
end = goToRightParenthesis(start, end);
11921205
if (Token::simpleMatch(end, "{"))

test/testunusedvar.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ class TestUnusedVar : public TestFixture {
181181
TEST_CASE(localvarFuncPtr); // #7194
182182
TEST_CASE(localvarAddr); // #7477
183183
TEST_CASE(localvarDelete);
184+
TEST_CASE(localvarReturnCallLambda); // #8941
184185

185186
TEST_CASE(localvarCppInitialization);
186187
TEST_CASE(localvarCpp11Initialization);
@@ -4232,6 +4233,14 @@ class TestUnusedVar : public TestFixture {
42324233
ASSERT_EQUALS("", errout.str());
42334234
}
42344235

4236+
void localvarReturnCallLambda() {
4237+
functionVariableUsage("int foo() {\n"
4238+
" auto f = []{return 1};\n"
4239+
" return f();\n"
4240+
"}");
4241+
ASSERT_EQUALS("", errout.str());
4242+
}
4243+
42354244
void localvarCppInitialization() {
42364245
functionVariableUsage("void foo() {\n"
42374246
" int buf[6];\n"

0 commit comments

Comments
 (0)