Skip to content

Commit b38e8ba

Browse files
committed
vf_analyzers.cpp: avoid unnecessary copy in ValueFlowAnaylzer::analyze()
1 parent b030416 commit b38e8ba

File tree

1 file changed

+16
-7
lines changed

1 file changed

+16
-7
lines changed

lib/vf_analyzers.cpp

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -627,16 +627,25 @@ struct ValueFlowAnalyzer : Analyzer {
627627
if (invalid())
628628
return Action::Invalid;
629629
// Follow references
630-
auto refs = tok->refs();
630+
const auto& refs = tok->refs();
631631
const bool inconclusiveRefs = refs.size() != 1;
632-
if (std::none_of(refs.cbegin(), refs.cend(), [&](const ReferenceToken& ref) {
632+
const bool analyzeTok = std::none_of(refs.cbegin(), refs.cend(), [&](const ReferenceToken& ref) {
633633
return tok == ref.token;
634-
}))
635-
refs.emplace_back(ReferenceToken{tok, {}});
636-
for (const ReferenceToken& ref:refs) {
637-
Action a = analyzeToken(ref.token, tok, d, inconclusiveRefs && ref.token != tok);
638-
if (internalMatch(ref.token))
634+
});
635+
auto analyze_f = [&](const Token* ref_token) -> Action
636+
{
637+
Action a = analyzeToken(ref_token, tok, d, inconclusiveRefs && ref_token != tok);
638+
if (internalMatch(ref_token))
639639
a |= Action::Internal;
640+
return a;
641+
};
642+
for (const ReferenceToken& ref:refs) {
643+
auto a = analyze_f(ref.token);
644+
if (a != Action::None)
645+
return a;
646+
}
647+
if (analyzeTok) {
648+
auto a = analyze_f(tok);
640649
if (a != Action::None)
641650
return a;
642651
}

0 commit comments

Comments
 (0)