diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index db77f2c78..1b5b82d9a 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -5681,7 +5681,10 @@ void SymbolDatabase::setValueTypeInTokenList(bool reportDebugWarnings) // library type/function else if (tok->previous()) { if (tok->astParent() && Token::Match(tok->astOperand1(), "%name%|::")) { - if (const Library::Container *c = mSettings->library.detectContainer(tok->astOperand1())) { + const Token *typeStartToken = tok->astOperand1(); + while (typeStartToken && typeStartToken->str() == "::") + typeStartToken = typeStartToken->astOperand1(); + if (const Library::Container *c = mSettings->library.detectContainer(typeStartToken)) { ValueType vt; vt.pointer = 0; vt.container = c; diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index f49776223..23299e3e6 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -6618,6 +6618,7 @@ private: string.arrayLike_indexOp = string.stdStringLike = true; set.library.containers["test::string"] = string; ASSERT_EQUALS("signed int", typeOf("Vector v; v[0]=3;", "[", "test.cpp", &set)); + ASSERT_EQUALS("container(test :: string)", typeOf("return test::string();", "(", "test.cpp", &set)); ASSERT_EQUALS("container(test :: string)", typeOf("void foo(Vector v) { for (auto s: v) { x=s+s; } }", "s", "test.cpp", &set)); ASSERT_EQUALS("container(test :: string)", typeOf("void foo(Vector v) { for (auto s: v) { x=s+s; } }", "+", "test.cpp", &set)); }