Coverage Report

Created: 2026-06-30 07:08

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/solidity/libsolutil/Algorithms.h
Line
Count
Source
1
/*
2
  This file is part of solidity.
3
4
  solidity is free software: you can redistribute it and/or modify
5
  it under the terms of the GNU General Public License as published by
6
  the Free Software Foundation, either version 3 of the License, or
7
  (at your option) any later version.
8
9
  solidity is distributed in the hope that it will be useful,
10
  but WITHOUT ANY WARRANTY; without even the implied warranty of
11
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
  GNU General Public License for more details.
13
14
  You should have received a copy of the GNU General Public License
15
  along with solidity.  If not, see <http://www.gnu.org/licenses/>.
16
*/
17
// SPDX-License-Identifier: GPL-3.0
18
#pragma once
19
20
21
#include <functional>
22
#include <list>
23
#include <set>
24
25
namespace solidity::util
26
{
27
28
/**
29
 * Detector for cycles in directed graphs. It returns the first
30
 * vertex on the path towards a cycle or a nullptr if there is
31
 * no reachable cycle starting from a given vertex.
32
 */
33
template <typename V>
34
class CycleDetector
35
{
36
public:
37
  using Visitor = std::function<void(V const&, CycleDetector&, size_t)>;
38
39
  /// Initializes the cycle detector
40
  /// @param _visit function that is given the current vertex
41
  ///               and is supposed to call @a run on all
42
  ///               adjacent vertices.
43
  explicit CycleDetector(Visitor _visit):
44
25.1k
    m_visit(std::move(_visit))
45
25.1k
  {  }
solidity::util::CycleDetector<solidity::frontend::ContractDefinition>::CycleDetector(std::__1::function<void (solidity::frontend::ContractDefinition const&, solidity::util::CycleDetector<solidity::frontend::ContractDefinition>&, unsigned long)>)
Line
Count
Source
44
14.8k
    m_visit(std::move(_visit))
45
14.8k
  {  }
solidity::util::CycleDetector<solidity::frontend::StructDefinition>::CycleDetector(std::__1::function<void (solidity::frontend::StructDefinition const&, solidity::util::CycleDetector<solidity::frontend::StructDefinition>&, unsigned long)>)
Line
Count
Source
44
9.28k
    m_visit(std::move(_visit))
45
9.28k
  {  }
solidity::util::CycleDetector<solidity::frontend::VariableDeclaration>::CycleDetector(std::__1::function<void (solidity::frontend::VariableDeclaration const&, solidity::util::CycleDetector<solidity::frontend::VariableDeclaration>&, unsigned long)>)
Line
Count
Source
44
1.01k
    m_visit(std::move(_visit))
45
1.01k
  {  }
46
47
  /// Recursively perform cycle detection starting
48
  /// (or continuing) with @param _vertex
49
  /// @returns the first vertex on the path towards a cycle from @a _vertex
50
  /// or nullptr if no cycle is reachable from @a _vertex.
51
  V const* run(V const& _vertex)
52
66.5k
  {
53
66.5k
    if (m_firstCycleVertex)
54
0
      return m_firstCycleVertex;
55
66.5k
    if (m_processed.count(&_vertex))
56
249
      return nullptr;
57
66.2k
    else if (m_processing.count(&_vertex))
58
195
      return m_firstCycleVertex = &_vertex;
59
66.0k
    m_processing.insert(&_vertex);
60
61
66.0k
    m_depth++;
62
66.0k
    m_visit(_vertex, *this, m_depth);
63
66.0k
    m_depth--;
64
66.0k
    if (m_firstCycleVertex && m_depth == 1)
65
175
      m_firstCycleVertex = &_vertex;
66
67
66.0k
    m_processing.erase(&_vertex);
68
66.0k
    m_processed.insert(&_vertex);
69
66.0k
    return m_firstCycleVertex;
70
66.5k
  }
solidity::util::CycleDetector<solidity::frontend::ContractDefinition>::run(solidity::frontend::ContractDefinition const&)
Line
Count
Source
52
15.1k
  {
53
15.1k
    if (m_firstCycleVertex)
54
0
      return m_firstCycleVertex;
55
15.1k
    if (m_processed.count(&_vertex))
56
0
      return nullptr;
57
15.1k
    else if (m_processing.count(&_vertex))
58
33
      return m_firstCycleVertex = &_vertex;
59
15.1k
    m_processing.insert(&_vertex);
60
61
15.1k
    m_depth++;
62
15.1k
    m_visit(_vertex, *this, m_depth);
63
15.1k
    m_depth--;
64
15.1k
    if (m_firstCycleVertex && m_depth == 1)
65
29
      m_firstCycleVertex = &_vertex;
66
67
15.1k
    m_processing.erase(&_vertex);
68
15.1k
    m_processed.insert(&_vertex);
69
15.1k
    return m_firstCycleVertex;
70
15.1k
  }
solidity::util::CycleDetector<solidity::frontend::StructDefinition>::run(solidity::frontend::StructDefinition const&)
Line
Count
Source
52
49.6k
  {
53
49.6k
    if (m_firstCycleVertex)
54
0
      return m_firstCycleVertex;
55
49.6k
    if (m_processed.count(&_vertex))
56
219
      return nullptr;
57
49.3k
    else if (m_processing.count(&_vertex))
58
7
      return m_firstCycleVertex = &_vertex;
59
49.3k
    m_processing.insert(&_vertex);
60
61
49.3k
    m_depth++;
62
49.3k
    m_visit(_vertex, *this, m_depth);
63
49.3k
    m_depth--;
64
49.3k
    if (m_firstCycleVertex && m_depth == 1)
65
5
      m_firstCycleVertex = &_vertex;
66
67
49.3k
    m_processing.erase(&_vertex);
68
49.3k
    m_processed.insert(&_vertex);
69
49.3k
    return m_firstCycleVertex;
70
49.6k
  }
solidity::util::CycleDetector<solidity::frontend::VariableDeclaration>::run(solidity::frontend::VariableDeclaration const&)
Line
Count
Source
52
1.76k
  {
53
1.76k
    if (m_firstCycleVertex)
54
0
      return m_firstCycleVertex;
55
1.76k
    if (m_processed.count(&_vertex))
56
30
      return nullptr;
57
1.73k
    else if (m_processing.count(&_vertex))
58
155
      return m_firstCycleVertex = &_vertex;
59
1.58k
    m_processing.insert(&_vertex);
60
61
1.58k
    m_depth++;
62
1.58k
    m_visit(_vertex, *this, m_depth);
63
1.58k
    m_depth--;
64
1.58k
    if (m_firstCycleVertex && m_depth == 1)
65
141
      m_firstCycleVertex = &_vertex;
66
67
1.58k
    m_processing.erase(&_vertex);
68
1.58k
    m_processed.insert(&_vertex);
69
1.58k
    return m_firstCycleVertex;
70
1.76k
  }
71
72
private:
73
  Visitor m_visit;
74
  std::set<V const*> m_processing;
75
  std::set<V const*> m_processed;
76
  size_t m_depth = 0;
77
  V const* m_firstCycleVertex = nullptr;
78
};
79
80
/**
81
 * Generic breadth first search.
82
 *
83
 * Note that V needs to be a comparable value type or a pointer.
84
 *
85
 * Example: Gather all (recursive) children in a graph starting at (and including) ``root``:
86
 *
87
 * Node const* root = ...;
88
 * std::set<Node const*> allNodes = BreadthFirstSearch<Node const*>{{root}}.run([](Node const* _node, auto&& _addChild) {
89
 *   // Potentially process ``_node``.
90
 *   for (Node const& _child: _node->children())
91
 *     // Potentially filter the children to be visited.
92
 *     _addChild(&_child);
93
 * }).visited;
94
 */
95
template<typename V>
96
struct BreadthFirstSearch
97
{
98
  /// Runs the breadth first search. The verticesToTraverse member of the struct needs to be initialized.
99
  /// @param _forEachChild is a callable of the form [...](V const& _node, auto&& _addChild) { ... }
100
  /// that is called for each visited node and is supposed to call _addChild(childNode) for every child
101
  /// node of _node.
102
  template<typename ForEachChild>
103
  BreadthFirstSearch& run(ForEachChild&& _forEachChild)
104
5.12M
  {
105
34.5M
    while (!verticesToTraverse.empty())
106
29.4M
    {
107
29.4M
      V v = std::move(verticesToTraverse.front());
108
29.4M
      verticesToTraverse.pop_front();
109
110
29.4M
      if (!visited.insert(v).second)
111
4.92M
        continue;
112
113
25.4M
      _forEachChild(v, [this](V _vertex) {
114
25.4M
        verticesToTraverse.emplace_back(std::move(_vertex));
115
25.4M
      });
ControlFlowAnalyzer.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::CFGNode const*>::run<solidity::frontend::ControlFlowAnalyzer::checkUnreachable(solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*)::$_0>(solidity::frontend::ControlFlowAnalyzer::checkUnreachable(solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*)::$_0&&)::{lambda(solidity::frontend::CFGNode const*)#1}::operator()(solidity::frontend::CFGNode const*) const
Line
Count
Source
113
171k
      _forEachChild(v, [this](V _vertex) {
114
171k
        verticesToTraverse.emplace_back(std::move(_vertex));
115
171k
      });
ControlFlowAnalyzer.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::CFGNode const*>::run<solidity::frontend::ControlFlowAnalyzer::checkUnreachable(solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*)::$_1>(solidity::frontend::ControlFlowAnalyzer::checkUnreachable(solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*)::$_1&&)::{lambda(solidity::frontend::CFGNode const*)#1}::operator()(solidity::frontend::CFGNode const*) const
Line
Count
Source
113
218k
      _forEachChild(v, [this](V _vertex) {
114
218k
        verticesToTraverse.emplace_back(std::move(_vertex));
115
218k
      });
ControlFlowRevertPruner.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::CFGNode*>::run<solidity::frontend::ControlFlowRevertPruner::findRevertStates()::$_0>(solidity::frontend::ControlFlowRevertPruner::findRevertStates()::$_0&&)::{lambda(solidity::frontend::CFGNode*)#1}::operator()(solidity::frontend::CFGNode*) const
Line
Count
Source
113
107k
      _forEachChild(v, [this](V _vertex) {
114
107k
        verticesToTraverse.emplace_back(std::move(_vertex));
115
107k
      });
ControlFlowRevertPruner.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::CFGNode*>::run<solidity::frontend::ControlFlowRevertPruner::modifyFunctionFlows()::$_0>(solidity::frontend::ControlFlowRevertPruner::modifyFunctionFlows()::$_0&&)::{lambda(solidity::frontend::CFGNode*)#1}::operator()(solidity::frontend::CFGNode*) const
Line
Count
Source
113
171k
      _forEachChild(v, [this](V _vertex) {
114
171k
        verticesToTraverse.emplace_back(std::move(_vertex));
115
171k
      });
Types.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::StructDefinition const*>::run<solidity::frontend::StructType::containsNestedMapping() const::$_0>(solidity::frontend::StructType::containsNestedMapping() const::$_0&&)::{lambda(solidity::frontend::StructDefinition const*)#1}::operator()(solidity::frontend::StructDefinition const*) const
Line
Count
Source
113
41.0k
      _forEachChild(v, [this](V _vertex) {
114
41.0k
        verticesToTraverse.emplace_back(std::move(_vertex));
115
41.0k
      });
Types.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::StructDefinition const*>::run<solidity::frontend::StructType::interfaceType(bool) const::$_0>(solidity::frontend::StructType::interfaceType(bool) const::$_0&&)::{lambda(solidity::frontend::StructDefinition const*)#1}::operator()(solidity::frontend::StructDefinition const*) const
Line
Count
Source
113
22
      _forEachChild(v, [this](V _vertex) {
114
22
        verticesToTraverse.emplace_back(std::move(_vertex));
115
22
      });
Unexecuted instantiation: CHC.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::Type const*>::run<solidity::frontend::CHC::defineExternalFunctionInterface(solidity::frontend::FunctionDefinition const&, solidity::frontend::ContractDefinition const&)::$_0::operator()(solidity::frontend::VariableDeclaration const*) const::{lambda(auto:1, auto:2&&)#1}>(solidity::frontend::CHC::defineExternalFunctionInterface(solidity::frontend::FunctionDefinition const&, solidity::frontend::ContractDefinition const&)::$_0::operator()(solidity::frontend::VariableDeclaration const*) const::{lambda(auto:1, auto:2&&)#1}&&)::{lambda(solidity::frontend::Type const*)#1}::operator()(solidity::frontend::Type const*) const
CHC.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::CHC::transactionVerificationTargetsIds(solidity::frontend::ASTNode const*)::ASTNodeCompare>::run<solidity::frontend::CHC::transactionVerificationTargetsIds(solidity::frontend::ASTNode const*)::$_0>(solidity::frontend::CHC::transactionVerificationTargetsIds(solidity::frontend::ASTNode const*)::$_0&&)::{lambda(solidity::frontend::CHC::transactionVerificationTargetsIds(solidity::frontend::ASTNode const*)::ASTNodeCompare)#1}::operator()(solidity::frontend::CHC::transactionVerificationTargetsIds(solidity::frontend::ASTNode const*)::ASTNodeCompare) const
Line
Count
Source
113
4.59k
      _forEachChild(v, [this](V _vertex) {
114
4.59k
        verticesToTraverse.emplace_back(std::move(_vertex));
115
4.59k
      });
Unexecuted instantiation: CHC.cpp:solidity::util::BreadthFirstSearch<unsigned int>::run<solidity::frontend::CHC::generateCounterexample(solidity::smtutil::CHCSolverInterface::CexGraph const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_3>(solidity::frontend::CHC::generateCounterexample(solidity::smtutil::CHCSolverInterface::CexGraph const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_3&&)::{lambda(unsigned int)#1}::operator()(unsigned int) const
SMTEncoder.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::Type const*>::run<solidity::frontend::SMTEncoder::sameTypeOrSubtype(solidity::frontend::Type const*, solidity::frontend::Type const*)::$_0>(solidity::frontend::SMTEncoder::sameTypeOrSubtype(solidity::frontend::Type const*, solidity::frontend::Type const*)::$_0&&)::{lambda(solidity::frontend::Type const*)#1}::operator()(solidity::frontend::Type const*) const
Line
Count
Source
113
9.75k
      _forEachChild(v, [this](V _vertex) {
114
9.75k
        verticesToTraverse.emplace_back(std::move(_vertex));
115
9.75k
      });
StackLayoutGenerator.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>::run<solidity::yul::StackLayoutGenerator::fillInJunk(solidity::yul::CFG::BasicBlock const&, solidity::yul::CFG::FunctionInfo const*)::$_0::operator()(solidity::yul::CFG::BasicBlock const*, unsigned long) const::{lambda(solidity::yul::CFG::BasicBlock const*, auto:1)#1}>(solidity::yul::StackLayoutGenerator::fillInJunk(solidity::yul::CFG::BasicBlock const&, solidity::yul::CFG::FunctionInfo const*)::$_0::operator()(solidity::yul::CFG::BasicBlock const*, unsigned long) const::{lambda(solidity::yul::CFG::BasicBlock const*, auto:1)#1}&&)::{lambda(solidity::yul::CFG::BasicBlock const*)#1}::operator()(solidity::yul::CFG::BasicBlock const*) const
Line
Count
Source
113
1.97M
      _forEachChild(v, [this](V _vertex) {
114
1.97M
        verticesToTraverse.emplace_back(std::move(_vertex));
115
1.97M
      });
StackLayoutGenerator.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>::run<solidity::yul::StackLayoutGenerator::processEntryPoint(solidity::yul::CFG::BasicBlock const&, solidity::yul::CFG::FunctionInfo const*)::$_1>(solidity::yul::StackLayoutGenerator::processEntryPoint(solidity::yul::CFG::BasicBlock const&, solidity::yul::CFG::FunctionInfo const*)::$_1&&)::{lambda(solidity::yul::CFG::BasicBlock const*)#1}::operator()(solidity::yul::CFG::BasicBlock const*) const
Line
Count
Source
113
1.66M
      _forEachChild(v, [this](V _vertex) {
114
1.66M
        verticesToTraverse.emplace_back(std::move(_vertex));
115
1.66M
      });
StackLayoutGenerator.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>::run<solidity::yul::StackLayoutGenerator::collectBackwardsJumps(solidity::yul::CFG::BasicBlock const&) const::$_0>(solidity::yul::StackLayoutGenerator::collectBackwardsJumps(solidity::yul::CFG::BasicBlock const&) const::$_0&&)::{lambda(solidity::yul::CFG::BasicBlock const*)#1}::operator()(solidity::yul::CFG::BasicBlock const*) const
Line
Count
Source
113
2.85M
      _forEachChild(v, [this](V _vertex) {
114
2.85M
        verticesToTraverse.emplace_back(std::move(_vertex));
115
2.85M
      });
StackLayoutGenerator.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>::run<solidity::yul::StackLayoutGenerator::stitchConditionalJumps(solidity::yul::CFG::BasicBlock const&)::$_0>(solidity::yul::StackLayoutGenerator::stitchConditionalJumps(solidity::yul::CFG::BasicBlock const&)::$_0&&)::{lambda(solidity::yul::CFG::BasicBlock const*)#1}::operator()(solidity::yul::CFG::BasicBlock const*) const
Line
Count
Source
113
2.53M
      _forEachChild(v, [this](V _vertex) {
114
2.53M
        verticesToTraverse.emplace_back(std::move(_vertex));
115
2.53M
      });
StackLayoutGenerator.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>::run<solidity::yul::StackLayoutGenerator::reportStackTooDeep(solidity::yul::CFG::BasicBlock const&) const::$_0>(solidity::yul::StackLayoutGenerator::reportStackTooDeep(solidity::yul::CFG::BasicBlock const&) const::$_0&&)::{lambda(solidity::yul::CFG::BasicBlock const*)#1}::operator()(solidity::yul::CFG::BasicBlock const*) const
Line
Count
Source
113
2.03M
      _forEachChild(v, [this](V _vertex) {
114
2.03M
        verticesToTraverse.emplace_back(std::move(_vertex));
115
2.03M
      });
StackLayoutGenerator.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>::run<solidity::yul::StackLayoutGenerator::fillInJunk(solidity::yul::CFG::BasicBlock const&, solidity::yul::CFG::FunctionInfo const*)::$_3>(solidity::yul::StackLayoutGenerator::fillInJunk(solidity::yul::CFG::BasicBlock const&, solidity::yul::CFG::FunctionInfo const*)::$_3&&)::{lambda(solidity::yul::CFG::BasicBlock const*)#1}::operator()(solidity::yul::CFG::BasicBlock const*) const
Line
Count
Source
113
2.85M
      _forEachChild(v, [this](V _vertex) {
114
2.85M
        verticesToTraverse.emplace_back(std::move(_vertex));
115
2.85M
      });
Unexecuted instantiation: JSONExporter.cpp:solidity::util::BreadthFirstSearch<solidity::yul::ssa::BlockId>::run<(anonymous namespace)::exportBlock(solidity::yul::ssa::SSACFG const&, solidity::yul::ssa::BlockId, solidity::yul::ssa::LivenessAnalysis const*, solidity::yul::ssa::ControlFlowGraphs const&)::$_0>((anonymous namespace)::exportBlock(solidity::yul::ssa::SSACFG const&, solidity::yul::ssa::BlockId, solidity::yul::ssa::LivenessAnalysis const*, solidity::yul::ssa::ControlFlowGraphs const&)::$_0&&)::{lambda(solidity::yul::ssa::BlockId)#1}::operator()(solidity::yul::ssa::BlockId) const
ControlFlowGraphBuilder.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock*>::run<(anonymous namespace)::cleanUnreachable(solidity::yul::CFG&)::$_3>((anonymous namespace)::cleanUnreachable(solidity::yul::CFG&)::$_3&&)::{lambda(solidity::yul::CFG::BasicBlock*)#1}::operator()(solidity::yul::CFG::BasicBlock*) const
Line
Count
Source
113
3.66M
      _forEachChild(v, [this](V _vertex) {
114
3.66M
        verticesToTraverse.emplace_back(std::move(_vertex));
115
3.66M
      });
ControlFlowGraphBuilder.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock*>::run<(anonymous namespace)::markRecursiveCalls(solidity::yul::CFG&)::$_0::operator()(solidity::yul::CFG::BasicBlock*) const::{lambda(solidity::yul::CFG::BasicBlock*, auto:1)#1}>((anonymous namespace)::markRecursiveCalls(solidity::yul::CFG&)::$_0::operator()(solidity::yul::CFG::BasicBlock*) const::{lambda(solidity::yul::CFG::BasicBlock*, auto:1)#1}&&)::{lambda(solidity::yul::CFG::BasicBlock*)#1}::operator()(solidity::yul::CFG::BasicBlock*) const
Line
Count
Source
113
1.48M
      _forEachChild(v, [this](V _vertex) {
114
1.48M
        verticesToTraverse.emplace_back(std::move(_vertex));
115
1.48M
      });
ControlFlowGraphBuilder.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::FunctionCall*>::run<(anonymous namespace)::markRecursiveCalls(solidity::yul::CFG&)::$_1>((anonymous namespace)::markRecursiveCalls(solidity::yul::CFG&)::$_1&&)::{lambda(solidity::yul::CFG::FunctionCall*)#1}::operator()(solidity::yul::CFG::FunctionCall*) const
Line
Count
Source
113
2.73M
      _forEachChild(v, [this](V _vertex) {
114
2.73M
        verticesToTraverse.emplace_back(std::move(_vertex));
115
2.73M
      });
ControlFlowGraphBuilder.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock*>::run<(anonymous namespace)::markNeedsCleanStack(solidity::yul::CFG&)::$_0>((anonymous namespace)::markNeedsCleanStack(solidity::yul::CFG&)::$_0&&)::{lambda(solidity::yul::CFG::BasicBlock*)#1}::operator()(solidity::yul::CFG::BasicBlock*) const
Line
Count
Source
113
1.35M
      _forEachChild(v, [this](V _vertex) {
114
1.35M
        verticesToTraverse.emplace_back(std::move(_vertex));
115
1.35M
      });
CircularReferencesPruner.cpp:solidity::util::BreadthFirstSearch<solidity::yul::YulString>::run<solidity::yul::CircularReferencesPruner::functionsCalledFromOutermostContext(solidity::yul::CallGraph const&)::$_0>(solidity::yul::CircularReferencesPruner::functionsCalledFromOutermostContext(solidity::yul::CallGraph const&)::$_0&&)::{lambda(solidity::yul::YulString)#1}::operator()(solidity::yul::YulString) const
Line
Count
Source
113
1.53M
      _forEachChild(v, [this](V _vertex) {
114
1.53M
        verticesToTraverse.emplace_back(std::move(_vertex));
115
1.53M
      });
116
24.5M
    }
117
5.12M
    return *this;
118
5.12M
  }
ControlFlowAnalyzer.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::CFGNode const*>& solidity::util::BreadthFirstSearch<solidity::frontend::CFGNode const*>::run<solidity::frontend::ControlFlowAnalyzer::checkUnreachable(solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*)::$_0>(solidity::frontend::ControlFlowAnalyzer::checkUnreachable(solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*)::$_0&&)
Line
Count
Source
104
18.4k
  {
105
208k
    while (!verticesToTraverse.empty())
106
189k
    {
107
189k
      V v = std::move(verticesToTraverse.front());
108
189k
      verticesToTraverse.pop_front();
109
110
189k
      if (!visited.insert(v).second)
111
44.3k
        continue;
112
113
145k
      _forEachChild(v, [this](V _vertex) {
114
145k
        verticesToTraverse.emplace_back(std::move(_vertex));
115
145k
      });
116
145k
    }
117
18.4k
    return *this;
118
18.4k
  }
ControlFlowAnalyzer.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::CFGNode const*>& solidity::util::BreadthFirstSearch<solidity::frontend::CFGNode const*>::run<solidity::frontend::ControlFlowAnalyzer::checkUnreachable(solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*)::$_1>(solidity::frontend::ControlFlowAnalyzer::checkUnreachable(solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*)::$_1&&)
Line
Count
Source
104
18.4k
  {
105
291k
    while (!verticesToTraverse.empty())
106
273k
    {
107
273k
      V v = std::move(verticesToTraverse.front());
108
273k
      verticesToTraverse.pop_front();
109
110
273k
      if (!visited.insert(v).second)
111
46.2k
        continue;
112
113
227k
      _forEachChild(v, [this](V _vertex) {
114
227k
        verticesToTraverse.emplace_back(std::move(_vertex));
115
227k
      });
116
227k
    }
117
18.4k
    return *this;
118
18.4k
  }
ControlFlowRevertPruner.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::CFGNode*>& solidity::util::BreadthFirstSearch<solidity::frontend::CFGNode*>::run<solidity::frontend::ControlFlowRevertPruner::findRevertStates()::$_0>(solidity::frontend::ControlFlowRevertPruner::findRevertStates()::$_0&&)
Line
Count
Source
104
19.0k
  {
105
145k
    while (!verticesToTraverse.empty())
106
126k
    {
107
126k
      V v = std::move(verticesToTraverse.front());
108
126k
      verticesToTraverse.pop_front();
109
110
126k
      if (!visited.insert(v).second)
111
23.7k
        continue;
112
113
102k
      _forEachChild(v, [this](V _vertex) {
114
102k
        verticesToTraverse.emplace_back(std::move(_vertex));
115
102k
      });
116
102k
    }
117
19.0k
    return *this;
118
19.0k
  }
ControlFlowRevertPruner.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::CFGNode*>& solidity::util::BreadthFirstSearch<solidity::frontend::CFGNode*>::run<solidity::frontend::ControlFlowRevertPruner::modifyFunctionFlows()::$_0>(solidity::frontend::ControlFlowRevertPruner::modifyFunctionFlows()::$_0&&)
Line
Count
Source
104
18.4k
  {
105
208k
    while (!verticesToTraverse.empty())
106
189k
    {
107
189k
      V v = std::move(verticesToTraverse.front());
108
189k
      verticesToTraverse.pop_front();
109
110
189k
      if (!visited.insert(v).second)
111
44.3k
        continue;
112
113
145k
      _forEachChild(v, [this](V _vertex) {
114
145k
        verticesToTraverse.emplace_back(std::move(_vertex));
115
145k
      });
116
145k
    }
117
18.4k
    return *this;
118
18.4k
  }
Types.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::StructDefinition const*>& solidity::util::BreadthFirstSearch<solidity::frontend::StructDefinition const*>::run<solidity::frontend::StructType::containsNestedMapping() const::$_0>(solidity::frontend::StructType::containsNestedMapping() const::$_0&&)
Line
Count
Source
104
8.43k
  {
105
57.9k
    while (!verticesToTraverse.empty())
106
49.4k
    {
107
49.4k
      V v = std::move(verticesToTraverse.front());
108
49.4k
      verticesToTraverse.pop_front();
109
110
49.4k
      if (!visited.insert(v).second)
111
42
        continue;
112
113
49.4k
      _forEachChild(v, [this](V _vertex) {
114
49.4k
        verticesToTraverse.emplace_back(std::move(_vertex));
115
49.4k
      });
116
49.4k
    }
117
8.43k
    return *this;
118
8.43k
  }
Types.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::StructDefinition const*>& solidity::util::BreadthFirstSearch<solidity::frontend::StructDefinition const*>::run<solidity::frontend::StructType::interfaceType(bool) const::$_0>(solidity::frontend::StructType::interfaceType(bool) const::$_0&&)
Line
Count
Source
104
84
  {
105
184
    while (!verticesToTraverse.empty())
106
100
    {
107
100
      V v = std::move(verticesToTraverse.front());
108
100
      verticesToTraverse.pop_front();
109
110
100
      if (!visited.insert(v).second)
111
5
        continue;
112
113
95
      _forEachChild(v, [this](V _vertex) {
114
95
        verticesToTraverse.emplace_back(std::move(_vertex));
115
95
      });
116
95
    }
117
84
    return *this;
118
84
  }
Unexecuted instantiation: CHC.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::Type const*>& solidity::util::BreadthFirstSearch<solidity::frontend::Type const*>::run<solidity::frontend::CHC::defineExternalFunctionInterface(solidity::frontend::FunctionDefinition const&, solidity::frontend::ContractDefinition const&)::$_0::operator()(solidity::frontend::VariableDeclaration const*) const::{lambda(auto:1, auto:2&&)#1}>(solidity::frontend::CHC::defineExternalFunctionInterface(solidity::frontend::FunctionDefinition const&, solidity::frontend::ContractDefinition const&)::$_0::operator()(solidity::frontend::VariableDeclaration const*) const::{lambda(auto:1, auto:2&&)#1}&&)
CHC.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::CHC::transactionVerificationTargetsIds(solidity::frontend::ASTNode const*)::ASTNodeCompare>& solidity::util::BreadthFirstSearch<solidity::frontend::CHC::transactionVerificationTargetsIds(solidity::frontend::ASTNode const*)::ASTNodeCompare>::run<solidity::frontend::CHC::transactionVerificationTargetsIds(solidity::frontend::ASTNode const*)::$_0>(solidity::frontend::CHC::transactionVerificationTargetsIds(solidity::frontend::ASTNode const*)::$_0&&)
Line
Count
Source
104
24.7k
  {
105
54.0k
    while (!verticesToTraverse.empty())
106
29.3k
    {
107
29.3k
      V v = std::move(verticesToTraverse.front());
108
29.3k
      verticesToTraverse.pop_front();
109
110
29.3k
      if (!visited.insert(v).second)
111
1.34k
        continue;
112
113
28.0k
      _forEachChild(v, [this](V _vertex) {
114
28.0k
        verticesToTraverse.emplace_back(std::move(_vertex));
115
28.0k
      });
116
28.0k
    }
117
24.7k
    return *this;
118
24.7k
  }
Unexecuted instantiation: CHC.cpp:solidity::util::BreadthFirstSearch<unsigned int>& solidity::util::BreadthFirstSearch<unsigned int>::run<solidity::frontend::CHC::generateCounterexample(solidity::smtutil::CHCSolverInterface::CexGraph const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_3>(solidity::frontend::CHC::generateCounterexample(solidity::smtutil::CHCSolverInterface::CexGraph const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_3&&)
SMTEncoder.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::Type const*>& solidity::util::BreadthFirstSearch<solidity::frontend::Type const*>::run<solidity::frontend::SMTEncoder::sameTypeOrSubtype(solidity::frontend::Type const*, solidity::frontend::Type const*)::$_0>(solidity::frontend::SMTEncoder::sameTypeOrSubtype(solidity::frontend::Type const*, solidity::frontend::Type const*)::$_0&&)
Line
Count
Source
104
18.6k
  {
105
47.1k
    while (!verticesToTraverse.empty())
106
28.4k
    {
107
28.4k
      V v = std::move(verticesToTraverse.front());
108
28.4k
      verticesToTraverse.pop_front();
109
110
28.4k
      if (!visited.insert(v).second)
111
1.18k
        continue;
112
113
27.2k
      _forEachChild(v, [this](V _vertex) {
114
27.2k
        verticesToTraverse.emplace_back(std::move(_vertex));
115
27.2k
      });
116
27.2k
    }
117
18.6k
    return *this;
118
18.6k
  }
StackLayoutGenerator.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>& solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>::run<solidity::yul::StackLayoutGenerator::fillInJunk(solidity::yul::CFG::BasicBlock const&, solidity::yul::CFG::FunctionInfo const*)::$_0::operator()(solidity::yul::CFG::BasicBlock const*, unsigned long) const::{lambda(solidity::yul::CFG::BasicBlock const*, auto:1)#1}>(solidity::yul::StackLayoutGenerator::fillInJunk(solidity::yul::CFG::BasicBlock const&, solidity::yul::CFG::FunctionInfo const*)::$_0::operator()(solidity::yul::CFG::BasicBlock const*, unsigned long) const::{lambda(solidity::yul::CFG::BasicBlock const*, auto:1)#1}&&)
Line
Count
Source
104
180k
  {
105
2.34M
    while (!verticesToTraverse.empty())
106
2.16M
    {
107
2.16M
      V v = std::move(verticesToTraverse.front());
108
2.16M
      verticesToTraverse.pop_front();
109
110
2.16M
      if (!visited.insert(v).second)
111
443k
        continue;
112
113
1.71M
      _forEachChild(v, [this](V _vertex) {
114
1.71M
        verticesToTraverse.emplace_back(std::move(_vertex));
115
1.71M
      });
116
1.71M
    }
117
180k
    return *this;
118
180k
  }
StackLayoutGenerator.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>& solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>::run<solidity::yul::StackLayoutGenerator::processEntryPoint(solidity::yul::CFG::BasicBlock const&, solidity::yul::CFG::FunctionInfo const*)::$_1>(solidity::yul::StackLayoutGenerator::processEntryPoint(solidity::yul::CFG::BasicBlock const&, solidity::yul::CFG::FunctionInfo const*)::$_1&&)
Line
Count
Source
104
342k
  {
105
2.34M
    while (!verticesToTraverse.empty())
106
2.00M
    {
107
2.00M
      V v = std::move(verticesToTraverse.front());
108
2.00M
      verticesToTraverse.pop_front();
109
110
2.00M
      if (!visited.insert(v).second)
111
252k
        continue;
112
113
1.75M
      _forEachChild(v, [this](V _vertex) {
114
1.75M
        verticesToTraverse.emplace_back(std::move(_vertex));
115
1.75M
      });
116
1.75M
    }
117
342k
    return *this;
118
342k
  }
StackLayoutGenerator.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>& solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>::run<solidity::yul::StackLayoutGenerator::collectBackwardsJumps(solidity::yul::CFG::BasicBlock const&) const::$_0>(solidity::yul::StackLayoutGenerator::collectBackwardsJumps(solidity::yul::CFG::BasicBlock const&) const::$_0&&)
Line
Count
Source
104
578k
  {
105
4.01M
    while (!verticesToTraverse.empty())
106
3.43M
    {
107
3.43M
      V v = std::move(verticesToTraverse.front());
108
3.43M
      verticesToTraverse.pop_front();
109
110
3.43M
      if (!visited.insert(v).second)
111
590k
        continue;
112
113
2.84M
      _forEachChild(v, [this](V _vertex) {
114
2.84M
        verticesToTraverse.emplace_back(std::move(_vertex));
115
2.84M
      });
116
2.84M
    }
117
578k
    return *this;
118
578k
  }
StackLayoutGenerator.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>& solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>::run<solidity::yul::StackLayoutGenerator::stitchConditionalJumps(solidity::yul::CFG::BasicBlock const&)::$_0>(solidity::yul::StackLayoutGenerator::stitchConditionalJumps(solidity::yul::CFG::BasicBlock const&)::$_0&&)
Line
Count
Source
104
578k
  {
105
3.69M
    while (!verticesToTraverse.empty())
106
3.11M
    {
107
3.11M
      V v = std::move(verticesToTraverse.front());
108
3.11M
      verticesToTraverse.pop_front();
109
110
3.11M
      if (!visited.insert(v).second)
111
268k
        continue;
112
113
2.84M
      _forEachChild(v, [this](V _vertex) {
114
2.84M
        verticesToTraverse.emplace_back(std::move(_vertex));
115
2.84M
      });
116
2.84M
    }
117
578k
    return *this;
118
578k
  }
StackLayoutGenerator.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>& solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>::run<solidity::yul::StackLayoutGenerator::reportStackTooDeep(solidity::yul::CFG::BasicBlock const&) const::$_0>(solidity::yul::StackLayoutGenerator::reportStackTooDeep(solidity::yul::CFG::BasicBlock const&) const::$_0&&)
Line
Count
Source
104
430k
  {
105
2.89M
    while (!verticesToTraverse.empty())
106
2.46M
    {
107
2.46M
      V v = std::move(verticesToTraverse.front());
108
2.46M
      verticesToTraverse.pop_front();
109
110
2.46M
      if (!visited.insert(v).second)
111
177k
        continue;
112
113
2.28M
      _forEachChild(v, [this](V _vertex) {
114
2.28M
        verticesToTraverse.emplace_back(std::move(_vertex));
115
2.28M
      });
116
2.28M
    }
117
430k
    return *this;
118
430k
  }
StackLayoutGenerator.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>& solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>::run<solidity::yul::StackLayoutGenerator::fillInJunk(solidity::yul::CFG::BasicBlock const&, solidity::yul::CFG::FunctionInfo const*)::$_3>(solidity::yul::StackLayoutGenerator::fillInJunk(solidity::yul::CFG::BasicBlock const&, solidity::yul::CFG::FunctionInfo const*)::$_3&&)
Line
Count
Source
104
578k
  {
105
4.01M
    while (!verticesToTraverse.empty())
106
3.43M
    {
107
3.43M
      V v = std::move(verticesToTraverse.front());
108
3.43M
      verticesToTraverse.pop_front();
109
110
3.43M
      if (!visited.insert(v).second)
111
590k
        continue;
112
113
2.84M
      _forEachChild(v, [this](V _vertex) {
114
2.84M
        verticesToTraverse.emplace_back(std::move(_vertex));
115
2.84M
      });
116
2.84M
    }
117
578k
    return *this;
118
578k
  }
Unexecuted instantiation: JSONExporter.cpp:solidity::util::BreadthFirstSearch<solidity::yul::ssa::BlockId>& solidity::util::BreadthFirstSearch<solidity::yul::ssa::BlockId>::run<(anonymous namespace)::exportBlock(solidity::yul::ssa::SSACFG const&, solidity::yul::ssa::BlockId, solidity::yul::ssa::LivenessAnalysis const*, solidity::yul::ssa::ControlFlowGraphs const&)::$_0>((anonymous namespace)::exportBlock(solidity::yul::ssa::SSACFG const&, solidity::yul::ssa::BlockId, solidity::yul::ssa::LivenessAnalysis const*, solidity::yul::ssa::ControlFlowGraphs const&)::$_0&&)
ControlFlowGraphBuilder.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock*>& solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock*>::run<(anonymous namespace)::cleanUnreachable(solidity::yul::CFG&)::$_3>((anonymous namespace)::cleanUnreachable(solidity::yul::CFG&)::$_3&&)
Line
Count
Source
104
185k
  {
105
4.03M
    while (!verticesToTraverse.empty())
106
3.84M
    {
107
3.84M
      V v = std::move(verticesToTraverse.front());
108
3.84M
      verticesToTraverse.pop_front();
109
110
3.84M
      if (!visited.insert(v).second)
111
1.00M
        continue;
112
113
2.84M
      _forEachChild(v, [this](V _vertex) {
114
2.84M
        verticesToTraverse.emplace_back(std::move(_vertex));
115
2.84M
      });
116
2.84M
    }
117
185k
    return *this;
118
185k
  }
ControlFlowGraphBuilder.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock*>& solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock*>::run<(anonymous namespace)::markRecursiveCalls(solidity::yul::CFG&)::$_0::operator()(solidity::yul::CFG::BasicBlock*) const::{lambda(solidity::yul::CFG::BasicBlock*, auto:1)#1}>((anonymous namespace)::markRecursiveCalls(solidity::yul::CFG&)::$_0::operator()(solidity::yul::CFG::BasicBlock*) const::{lambda(solidity::yul::CFG::BasicBlock*, auto:1)#1}&&)
Line
Count
Source
104
392k
  {
105
2.27M
    while (!verticesToTraverse.empty())
106
1.87M
    {
107
1.87M
      V v = std::move(verticesToTraverse.front());
108
1.87M
      verticesToTraverse.pop_front();
109
110
1.87M
      if (!visited.insert(v).second)
111
283k
        continue;
112
113
1.59M
      _forEachChild(v, [this](V _vertex) {
114
1.59M
        verticesToTraverse.emplace_back(std::move(_vertex));
115
1.59M
      });
116
1.59M
    }
117
392k
    return *this;
118
392k
  }
ControlFlowGraphBuilder.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::FunctionCall*>& solidity::util::BreadthFirstSearch<solidity::yul::CFG::FunctionCall*>::run<(anonymous namespace)::markRecursiveCalls(solidity::yul::CFG&)::$_1>((anonymous namespace)::markRecursiveCalls(solidity::yul::CFG&)::$_1&&)
Line
Count
Source
104
455k
  {
105
2.46M
    while (!verticesToTraverse.empty())
106
2.00M
    {
107
2.00M
      V v = std::move(verticesToTraverse.front());
108
2.00M
      verticesToTraverse.pop_front();
109
110
2.00M
      if (!visited.insert(v).second)
111
505k
        continue;
112
113
1.50M
      _forEachChild(v, [this](V _vertex) {
114
1.50M
        verticesToTraverse.emplace_back(std::move(_vertex));
115
1.50M
      });
116
1.50M
    }
117
455k
    return *this;
118
455k
  }
ControlFlowGraphBuilder.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock*>& solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock*>::run<(anonymous namespace)::markNeedsCleanStack(solidity::yul::CFG&)::$_0>((anonymous namespace)::markNeedsCleanStack(solidity::yul::CFG&)::$_0&&)
Line
Count
Source
104
438k
  {
105
2.23M
    while (!verticesToTraverse.empty())
106
1.79M
    {
107
1.79M
      V v = std::move(verticesToTraverse.front());
108
1.79M
      verticesToTraverse.pop_front();
109
110
1.79M
      if (!visited.insert(v).second)
111
252k
        continue;
112
113
1.54M
      _forEachChild(v, [this](V _vertex) {
114
1.54M
        verticesToTraverse.emplace_back(std::move(_vertex));
115
1.54M
      });
116
1.54M
    }
117
438k
    return *this;
118
438k
  }
CircularReferencesPruner.cpp:solidity::util::BreadthFirstSearch<solidity::yul::YulString>& solidity::util::BreadthFirstSearch<solidity::yul::YulString>::run<solidity::yul::CircularReferencesPruner::functionsCalledFromOutermostContext(solidity::yul::CallGraph const&)::$_0>(solidity::yul::CircularReferencesPruner::functionsCalledFromOutermostContext(solidity::yul::CallGraph const&)::$_0&&)
Line
Count
Source
104
837k
  {
105
3.24M
    while (!verticesToTraverse.empty())
106
2.40M
    {
107
2.40M
      V v = std::move(verticesToTraverse.front());
108
2.40M
      verticesToTraverse.pop_front();
109
110
2.40M
      if (!visited.insert(v).second)
111
395k
        continue;
112
113
2.00M
      _forEachChild(v, [this](V _vertex) {
114
2.00M
        verticesToTraverse.emplace_back(std::move(_vertex));
115
2.00M
      });
116
2.00M
    }
117
837k
    return *this;
118
837k
  }
119
  void abort()
120
32.1k
  {
121
32.1k
    verticesToTraverse.clear();
122
32.1k
  }
solidity::util::BreadthFirstSearch<solidity::frontend::StructDefinition const*>::abort()
Line
Count
Source
120
53
  {
121
53
    verticesToTraverse.clear();
122
53
  }
solidity::util::BreadthFirstSearch<solidity::frontend::Type const*>::abort()
Line
Count
Source
120
1.91k
  {
121
1.91k
    verticesToTraverse.clear();
122
1.91k
  }
Unexecuted instantiation: solidity::util::BreadthFirstSearch<unsigned int>::abort()
solidity::util::BreadthFirstSearch<solidity::yul::CFG::FunctionCall*>::abort()
Line
Count
Source
120
30.1k
  {
121
30.1k
    verticesToTraverse.clear();
122
30.1k
  }
123
124
  std::list<V> verticesToTraverse;
125
  std::set<V> visited{};
126
};
127
128
}