diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 953c8256f34..9b7b7028f47 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -5271,6 +5271,7 @@ void SymbolDatabase::setValueType(Token *tok, const ValueType &valuetype) static const Token * parsedecl(const Token *type, ValueType * const valuetype, ValueType::Sign defaultSignedness, const Settings* settings) { + const Token * const previousType = type; const unsigned int pointer0 = valuetype->pointer; while (Token::Match(type->previous(), "%name%")) type = type->previous(); @@ -5305,7 +5306,7 @@ static const Token * parsedecl(const Token *type, ValueType * const valuetype, V valuetype->sign = ValueType::Sign::UNSIGNED; if (valuetype->type == ValueType::Type::UNKNOWN_TYPE && type->type() && type->type()->isTypeAlias() && type->type()->typeStart && - type->type()->typeStart->str() != type->str()) + type->type()->typeStart->str() != type->str() && type->type()->typeStart != previousType) parsedecl(type->type()->typeStart, valuetype, defaultSignedness, settings); else if (type->str() == "const") valuetype->constness |= (1 << (valuetype->pointer - pointer0)); diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 7f8b1384313..398423ae182 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -396,6 +396,8 @@ class TestSymbolDatabase: public TestFixture { TEST_CASE(auto12); // #8993 - const std::string &x; auto y = x; if (y.empty()) .. TEST_CASE(unionWithConstructor); + + TEST_CASE(incomplete_type); // #9255 (infinite recursion) } void array() { @@ -7072,6 +7074,25 @@ class TestSymbolDatabase: public TestFixture { f = Token::findsimplematch(tokenizer.tokens(), "Fred ( float"); ASSERT_EQUALS(true, db && f && f->function() && f->function()->tokenDef->linenr() == 3); } + + void incomplete_type() { + GET_SYMBOL_DB("template>\n" + " class SLSurfaceLayerData\n" + " : public _Vector_alloc<_Vec_base_types<_Ty, _Alloc>>\n" + "{ // varying size array of values\n" + "\n" + " using reverse_iterator = _STD reverse_iterator;\n" + " using const_reverse_iterator = _STD reverse_iterator;\n" + " const_reverse_iterator crend() const noexcept\n" + " { // return iterator for end of reversed nonmutable sequence\n" + " return (rend());\n" + " }\n" + "};"); + (void)db; + + ASSERT_EQUALS("", errout.str()); + } }; REGISTER_TEST(TestSymbolDatabase)