From e03a8e1dc1c5666c1d2e3ca9043682fd41c2291a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 11 Sep 2020 21:29:48 +0200 Subject: [PATCH] Fixed #9892 (Crash: endless recursion in Token::typeDecl for expression 'auto combo = widget->combo = new Combo{};') --- lib/token.cpp | 2 +- test/testsymboldatabase.cpp | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/token.cpp b/lib/token.cpp index 421257538..b8dc80976 100644 --- a/lib/token.cpp +++ b/lib/token.cpp @@ -2162,7 +2162,7 @@ std::pair Token::typeDecl(const Token * tok) const Token * tok2 = var->declEndToken(); if (Token::Match(tok2, "; %varid% =", var->declarationId())) tok2 = tok2->tokAt(2); - if (Token::simpleMatch(tok2, "=") && tok2->astOperand2()) { + if (Token::simpleMatch(tok2, "=") && Token::Match(tok2->astOperand2(), "!!=")) { std::pair r = typeDecl(tok2->astOperand2()); if (r.first) return r; diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 78c8817f4..9ab401c0b 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -430,6 +430,7 @@ private: TEST_CASE(auto11); // #8964 - const auto startX = x; TEST_CASE(auto12); // #8993 - const std::string &x; auto y = x; if (y.empty()) .. TEST_CASE(auto13); + TEST_CASE(auto14); TEST_CASE(unionWithConstructor); @@ -7789,6 +7790,18 @@ private: ASSERT(tok->variable()->valueType()->pointer); } + void auto14() { // #9892 - crash in Token::declType + GET_SYMBOL_DB("static void foo() {\n" + " auto combo = widget->combo = new Combo{};\n" + " combo->addItem();\n" + "}"); + + const Token *tok; + + tok = Token::findsimplematch(tokenizer.tokens(), "combo ="); + ASSERT(tok && !tok->valueType()); + } + void unionWithConstructor() { GET_SYMBOL_DB("union Fred {\n" " Fred(int x) : i(x) { }\n"