diff --git a/lib/vf_analyzers.cpp b/lib/vf_analyzers.cpp index 294ae8a1d5e..1b70b4446d1 100644 --- a/lib/vf_analyzers.cpp +++ b/lib/vf_analyzers.cpp @@ -838,6 +838,8 @@ static bool bifurcate(const Token* tok, const std::set& varids, cons const Variable* var = tok->variable(); if (!var) return false; + if (!var->isLocal() && !var->isArgument()) + return false; const Token* start = var->declEndToken(); if (!start) return false; diff --git a/test/cli/performance_test.py b/test/cli/performance_test.py index 61367d7a0d0..9f5141f2bb9 100644 --- a/test/cli/performance_test.py +++ b/test/cli/performance_test.py @@ -1,5 +1,5 @@ -# python -m pytest test-other.py +# python -m pytest performance_test.py import os import sys @@ -240,3 +240,130 @@ def test_crash_array_in_namespace(tmpdir): }; }""") cppcheck([filename]) # should not take more than ~5 seconds + +@pytest.mark.timeout(5) +def test_slow_bifurcate(tmpdir): + # #14134 + filename = os.path.join(tmpdir, 'hang.cpp') + with open(filename, 'wt') as f: + f.write(r""" + class C { + public: + enum class Status { + Ok, + Waiting, + Error, + }; + void setStatus(Status status, const QString& text); + QColor m_statusColor; + }; + + template < size_t N, typename T > + inline QDataStream& deserialize(QDataStream& in, T& value) { + if constexpr (N == 0) {} + else if constexpr (N == 1) { + auto& [f1] = value; + in >> f1; + } + else if constexpr (N == 2) { + auto& [f1, f2] = value; + in >> f1 >> f2; + } + else if constexpr (N == 3) { + auto& [f1, f2, f3] = value; + in >> f1 >> f2 >> f3; + } + else if constexpr (N == 4) { + auto& [f1, f2, f3, f4] = value; + in >> f1 >> f2 >> f3 >> f4; + } + else if constexpr (N == 5) { + auto& [f1, f2, f3, f4, f5] = value; + in >> f1 >> f2 >> f3 >> f4 >> f5; + } + else if constexpr (N == 6) { + auto& [f1, f2, f3, f4, f5, f6] = value; + in >> f1 >> f2 >> f3 >> f4 >> f5 >> f6; + } + else if constexpr (N == 7) { + auto& [f1, f2, f3, f4, f5, f6, f7] = value; + in >> f1 >> f2 >> f3 >> f4 >> f5 >> f6 >> f7; + } + else if constexpr (N == 8) { + auto& [f1, f2, f3, f4, f5, f6, f7, f8] = value; + in >> f1 >> f2 >> f3 >> f4 >> f5 >> f6 >> f7 >> f8; + } + else if constexpr (N == 9) { + auto& [f1, f2, f3, f4, f5, f6, f7, f8, f9] = value; + in >> f1 >> f2 >> f3 >> f4 >> f5 >> f6 >> f7 >> f8 >> f9; + } + else if constexpr (N == 10) { + auto& [f1, f2, f3, f4, f5, f6, f7, f8, f9, f10] = value; + in >> f1 >> f2 >> f3 >> f4 >> f5 >> f6 >> f7 >> f8 >> f9 >> f10; + } + else if constexpr (N == 11) { + auto& [f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11] = value; + in >> f1 >> f2 >> f3 >> f4 >> f5 >> f6 >> f7 >> f8 >> f9 >> f10 >> f11; + } + else if constexpr (N == 12) { + auto& [f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12] = value; + in >> f1 >> f2 >> f3 >> f4 >> f5 >> f6 >> f7 >> f8 >> f9 >> f10 >> f11 >> f12; + } + else if constexpr (N == 13) { + auto& [f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13] = value; + in >> f1 >> f2 >> f3 >> f4 >> f5 >> f6 >> f7 >> f8 >> f9 >> f10 >> f11 >> f12 >> f13; + } + else if constexpr (N == 14) { + auto& [f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14] = value; + in >> f1 >> f2 >> f3 >> f4 >> f5 >> f6 >> f7 >> f8 >> f9 >> f10 >> f11 >> f12 >> f13 >> f14; + } + else if constexpr (N == 15) { + auto& [f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15] = value; + in >> f1 >> f2 >> f3 >> f4 >> f5 >> f6 >> f7 >> f8 >> f9 >> f10 >> f11 >> f12 >> f13 >> f14 >> f15; + } + else if constexpr (N == 16) { + auto& [f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16] = value; + in >> f1 >> f2 >> f3 >> f4 >> f5 >> f6 >> f7 >> f8 >> f9 >> f10 >> f11 >> f12 >> f13 >> f14 >> f15 >> f16; + } + else if constexpr (N == 17) { + auto& [f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17] = value; + in >> f1 >> f2 >> f3 >> f4 >> f5 >> f6 >> f7 >> f8 >> f9 >> f10 >> f11 >> f12 >> f13 >> f14 >> f15 >> f16 >> f17; + } + else if constexpr (N == 18) { + auto& [f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18] = value; + in >> f1 >> f2 >> f3 >> f4 >> f5 >> f6 >> f7 >> f8 >> f9 >> f10 >> f11 >> f12 >> f13 >> f14 >> f15 >> f16 >> f17 >> f18; + } + else if constexpr (N == 19) { + auto& [f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19] = value; + in >> f1 >> f2 >> f3 >> f4 >> f5 >> f6 >> f7 >> f8 >> f9 >> f10 >> f11 >> f12 >> f13 >> f14 >> f15 >> f16 >> f17 >> f18 >> f19; + } + else if constexpr (N == 20) { + auto& [f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20] = value; + in >> f1 >> f2 >> f3 >> f4 >> f5 >> f6 >> f7 >> f8 >> f9 >> f10 >> f11 >> f12 >> f13 >> f14 >> f15 >> f16 >> f17 >> f18 >> f19 >> f20; + } + else { + static_assert (!sizeof(T), "missing implementation"); + } + return in; + } + + void C::setStatus(Status status, const QString& text) { + const auto& colors = Config::get().ui().colors; + QColor color; + switch (status) { + case Status::Ok: + color = colors.green; + break; + case Status::Waiting: + color = Qt::black; + break; + case Status::Error: + color = colors.red; + break; + } + + if (m_statusColor != color) { + m_statusColor = color; + } + }""") + cppcheck([filename]) # should not take more than ~1 second