Skip to content

Commit f54680c

Browse files
committed
vf_analyzers.cpp: avoid unnecessary copy in ValueFlowAnaylzer::analyze()
1 parent 7abfca5 commit f54680c

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
@@ -630,16 +630,25 @@ struct ValueFlowAnalyzer : Analyzer {
630630
if (invalid())
631631
return Action::Invalid;
632632
// Follow references
633-
auto refs = tok->refs();
633+
const auto& refs = tok->refs();
634634
const bool inconclusiveRefs = refs.size() != 1;
635-
if (std::none_of(refs.cbegin(), refs.cend(), [&](const ReferenceToken& ref) {
635+
const bool analyzeTok = std::none_of(refs.cbegin(), refs.cend(), [&](const ReferenceToken& ref) {
636636
return tok == ref.token;
637-
}))
638-
refs.emplace_back(ReferenceToken{tok, {}});
639-
for (const ReferenceToken& ref:refs) {
640-
Action a = analyzeToken(ref.token, tok, d, inconclusiveRefs && ref.token != tok);
641-
if (internalMatch(ref.token))
637+
});
638+
auto analyze_f = [&](const Token* ref_token) -> Action
639+
{
640+
Action a = analyzeToken(ref_token, tok, d, inconclusiveRefs && ref_token != tok);
641+
if (internalMatch(ref_token))
642642
a |= Action::Internal;
643+
return a;
644+
};
645+
for (const ReferenceToken& ref:refs) {
646+
auto a = analyze_f(ref.token);
647+
if (a != Action::None)
648+
return a;
649+
}
650+
if (analyzeTok) {
651+
auto a = analyze_f(tok);
643652
if (a != Action::None)
644653
return a;
645654
}

0 commit comments

Comments
 (0)