diff --git a/lib/tokenlist.cpp b/lib/tokenlist.cpp index 6c4cd7eb981..943b00a1e4a 100644 --- a/lib/tokenlist.cpp +++ b/lib/tokenlist.cpp @@ -609,7 +609,7 @@ static bool iscpp11init_impl(const Token * const tok) if (Token::Match(nameToken, "]|*")) { const Token* tok2 = nameToken; if (tok2->link()) { - while (tok2 && tok2->link()) + while (tok2 && precedes(tok2->link(), nameToken)) tok2 = tok2->link()->previous(); } else diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index a81130c3114..d0f2740606c 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -8709,6 +8709,10 @@ class TestTokenizer : public TestFixture { "{ 1", Token::Cpp11init::CPP11INIT); + testIsCpp11init("void f() { g([] { if (int x = 1; x) {} }); }", // #14790 + "{ int", + Token::Cpp11init::NOINIT); // don't hang + ASSERT_NO_THROW(tokenizeAndStringify("template struct X {};\n" // don't crash "template auto f(T t) -> X {}\n")); ASSERT_EQUALS("[test.cpp:2:22]: (debug) auto token with no type. [autoNoType]\n", errout_str());