Skip to content

Commit d73a33d

Browse files
authored
avoid redundant Token::declEndToken() calls (#4363)
1 parent 2afd5f8 commit d73a33d

4 files changed

Lines changed: 25 additions & 17 deletions

File tree

lib/astutils.cpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,8 @@ bool isVariableDecl(const Token* tok)
374374
return false;
375375
if (var->nameToken() == tok)
376376
return true;
377-
if (Token::Match(var->declEndToken(), "; %var%") && var->declEndToken()->next() == tok)
377+
const Token * const varDeclEndToken = var->declEndToken();
378+
if (Token::Match(varDeclEndToken, "; %var%") && varDeclEndToken->next() == tok)
378379
return true;
379380
return false;
380381
}
@@ -1068,16 +1069,17 @@ std::vector<ReferenceToken> followAllReferences(const Token* tok,
10681069
if (var->nameToken() == tok || isStructuredBindingVariable(var)) {
10691070
return {{tok, std::move(errors)}};
10701071
} else if (var->isReference() || var->isRValueReference()) {
1071-
if (!var->declEndToken())
1072+
const Token * const varDeclEndToken = var->declEndToken();
1073+
if (!varDeclEndToken)
10721074
return {{tok, std::move(errors)}};
10731075
if (var->isArgument()) {
1074-
errors.emplace_back(var->declEndToken(), "Passed to reference.");
1076+
errors.emplace_back(varDeclEndToken, "Passed to reference.");
10751077
return {{tok, std::move(errors)}};
1076-
} else if (Token::simpleMatch(var->declEndToken(), "=")) {
1077-
if (astHasToken(var->declEndToken(), tok))
1078+
} else if (Token::simpleMatch(varDeclEndToken, "=")) {
1079+
if (astHasToken(varDeclEndToken, tok))
10781080
return std::vector<ReferenceToken>{};
1079-
errors.emplace_back(var->declEndToken(), "Assigned to reference.");
1080-
const Token *vartok = var->declEndToken()->astOperand2();
1081+
errors.emplace_back(varDeclEndToken, "Assigned to reference.");
1082+
const Token *vartok = varDeclEndToken->astOperand2();
10811083
if (vartok == tok || (!temporary && isTemporary(true, vartok, nullptr, true) &&
10821084
(var->isConst() || var->isRValueReference())))
10831085
return {{tok, std::move(errors)}};

lib/checkautovariables.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -471,11 +471,12 @@ static bool isEscapedReference(const Variable* var)
471471
return false;
472472
if (!var->isReference())
473473
return false;
474-
if (!var->declEndToken())
474+
const Token * const varDeclEndToken = var->declEndToken();
475+
if (!varDeclEndToken)
475476
return false;
476-
if (!Token::simpleMatch(var->declEndToken(), "="))
477+
if (!Token::simpleMatch(varDeclEndToken, "="))
477478
return false;
478-
const Token* vartok = var->declEndToken()->astOperand2();
479+
const Token* vartok = varDeclEndToken->astOperand2();
479480
return !isTemporary(true, vartok, nullptr, false);
480481
}
481482

lib/checkother.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1297,7 +1297,8 @@ void CheckOther::checkPassByReference()
12971297
if (var->scope() && var->scope()->function->arg->link()->strAt(-1) == "...")
12981298
continue; // references could not be used as va_start parameters (#5824)
12991299

1300-
if ((var->declEndToken() && var->declEndToken()->isExternC()) ||
1300+
const Token * const varDeclEndToken = var->declEndToken();
1301+
if ((varDeclEndToken && varDeclEndToken->isExternC()) ||
13011302
(var->scope() && var->scope()->function && var->scope()->function->tokenDef && var->scope()->function->tokenDef->isExternC()))
13021303
continue; // references cannot be used in functions in extern "C" blocks
13031304

lib/valueflow.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3340,14 +3340,15 @@ static std::vector<LifetimeToken> getLifetimeTokens(const Token* tok,
33403340
return {{tok, std::move(errorPath)}};
33413341
if (var && var->declarationId() == tok->varId()) {
33423342
if (var->isReference() || var->isRValueReference()) {
3343-
if (!var->declEndToken())
3343+
const Token * const varDeclEndToken = var->declEndToken();
3344+
if (!varDeclEndToken)
33443345
return {{tok, true, std::move(errorPath)}};
33453346
if (var->isArgument()) {
3346-
errorPath.emplace_back(var->declEndToken(), "Passed to reference.");
3347+
errorPath.emplace_back(varDeclEndToken, "Passed to reference.");
33473348
return {{tok, true, std::move(errorPath)}};
3348-
} else if (Token::simpleMatch(var->declEndToken(), "=")) {
3349-
errorPath.emplace_back(var->declEndToken(), "Assigned to reference.");
3350-
const Token *vartok = var->declEndToken()->astOperand2();
3349+
} else if (Token::simpleMatch(varDeclEndToken, "=")) {
3350+
errorPath.emplace_back(varDeclEndToken, "Assigned to reference.");
3351+
const Token *vartok = varDeclEndToken->astOperand2();
33513352
const bool temporary = isTemporary(true, vartok, nullptr, true);
33523353
const bool nonlocal = var->isStatic() || var->isGlobal();
33533354
if (vartok == tok || (nonlocal && temporary) ||
@@ -4021,6 +4022,8 @@ struct LifetimeStore {
40214022
return;
40224023
if (!argtok)
40234024
return;
4025+
if (!tok)
4026+
return;
40244027
for (const ValueFlow::Value &v : argtok->values()) {
40254028
if (!v.isLifetimeValue())
40264029
continue;
@@ -4031,7 +4034,8 @@ struct LifetimeStore {
40314034
er.insert(er.end(), errorPath.begin(), errorPath.end());
40324035
if (!var)
40334036
continue;
4034-
for (const Token *tok3 = tok; tok3 && tok3 != var->declEndToken(); tok3 = tok3->previous()) {
4037+
const Token * const varDeclEndToken = var->declEndToken();
4038+
for (const Token *tok3 = tok; tok3 && tok3 != varDeclEndToken; tok3 = tok3->previous()) {
40354039
if (tok3->varId() == var->declarationId()) {
40364040
LifetimeStore{tok3, message, type, inconclusive}.byVal(tok, tokenlist, errorLogger, settings, pred);
40374041
break;

0 commit comments

Comments
 (0)