Skip to content

Commit 3741601

Browse files
committed
Unused value: Fix false positive (ast, {})
1 parent be6782d commit 3741601

4 files changed

Lines changed: 20 additions & 8 deletions

File tree

lib/astutils.cpp

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1084,17 +1084,15 @@ struct FwdAnalysis::Result FwdAnalysis::checkRecursive(const Token *expr, const
10841084
if (Token::Match(tok, "return|throw")) {
10851085
// TODO: Handle these better
10861086
// Is expr variable used in expression?
1087-
bool read = false;
1088-
visitAstNodes(tok->astOperand1(),
1089-
[&](const Token *tok2) {
1087+
const Token *end = tok->findExpressionStartEndTokens().second->next();
1088+
for (const Token *tok2 = tok; tok2 != end; tok2 = tok2->next()) {
10901089
if (!local && Token::Match(tok2, "%name% ("))
1091-
read = true;
1090+
return Result(Result::Type::READ);
10921091
if (tok2->varId() && exprVarIds.find(tok2->varId()) != exprVarIds.end())
1093-
read = true;
1094-
return read ? ChildrenToVisit::done : ChildrenToVisit::op1_and_op2;
1095-
});
1092+
return Result(Result::Type::READ);
1093+
}
10961094

1097-
return Result(read ? Result::Type::READ : Result::Type::RETURN);
1095+
return Result(Result::Type::RETURN);
10981096
}
10991097

11001098
if (tok->str() == "}") {

lib/token.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1215,6 +1215,8 @@ std::pair<const Token *, const Token *> Token::findExpressionStartEndTokens() co
12151215

12161216
start = goToLeftParenthesis(start, end);
12171217
end = goToRightParenthesis(start, end);
1218+
if (Token::simpleMatch(end, "{"))
1219+
end = end->link();
12181220
return std::pair<const Token *, const Token *>(start,end);
12191221
}
12201222

test/testtoken.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -939,6 +939,9 @@ class TestToken : public TestFixture {
939939
givenACodeSampleToTokenize var2("typedef unsigned long long u64; void f() { *((u64 *)x) = 0; }");
940940
const Token *const tok2 = Token::findsimplematch(var2.tokens(), "*");
941941
ASSERT_EQUALS("*((unsigned long long*)x)", tok2->expressionString());
942+
943+
givenACodeSampleToTokenize data3("return (t){1,2};");
944+
ASSERT_EQUALS("return(t){1,2}", data3.tokens()->expressionString());
942945
}
943946
};
944947

test/testunusedvar.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ class TestUnusedVar : public TestFixture {
107107
TEST_CASE(localvar51); // ticket #8128 - FN : tok = tok->next();
108108
TEST_CASE(localvar52);
109109
TEST_CASE(localvar53); // continue
110+
TEST_CASE(localvar54); // ast, {}
110111
TEST_CASE(localvaralias1);
111112
TEST_CASE(localvaralias2); // ticket #1637
112113
TEST_CASE(localvaralias3); // ticket #1639
@@ -2109,6 +2110,14 @@ class TestUnusedVar : public TestFixture {
21092110
// TODO ASSERT_EQUALS("[test.cpp:5]: (style) Variable 'x' is assigned a value that is never used.\n", errout.str());
21102111
}
21112112

2113+
void localvar54() {
2114+
functionVariableUsage("Padding fun() {\n"
2115+
" Distance d = DISTANCE;\n"
2116+
" return (Padding){ d, d, d, d };\n"
2117+
"}\n");
2118+
ASSERT_EQUALS("", errout.str());
2119+
}
2120+
21122121
void localvaralias1() {
21132122
functionVariableUsage("void foo()\n"
21142123
"{\n"

0 commit comments

Comments
 (0)