diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index f2453c3d7f0..f7393267ae6 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -7303,9 +7303,9 @@ static const Token* parsedecl(const Token* type, type = type->next(); } break; - } else if (!valuetype->typeScope && (type->str() == "struct" || type->str() == "enum")) + } else if (!valuetype->typeScope && (type->str() == "struct" || type->str() == "enum") && valuetype->type != ValueType::Type::SMART_POINTER) valuetype->type = type->str() == "struct" ? ValueType::Type::RECORD : ValueType::Type::NONSTD; - else if (!valuetype->typeScope && type->type() && type->type()->classScope) { + else if (!valuetype->typeScope && type->type() && type->type()->classScope && valuetype->type != ValueType::Type::SMART_POINTER) { if (type->type()->classScope->type == Scope::ScopeType::eEnum) { valuetype->sign = ValueType::Sign::SIGNED; valuetype->type = getEnumType(type->type()->classScope, settings.platform); diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 5a69a402fbe..7a4af16df6e 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -221,6 +221,7 @@ class TestSymbolDatabase : public TestFixture { TEST_CASE(VariableValueType3); TEST_CASE(VariableValueType4); // smart pointer type TEST_CASE(VariableValueType5); // smart pointer type + TEST_CASE(VariableValueType6); // smart pointer type TEST_CASE(VariableValueTypeReferences); TEST_CASE(VariableValueTypeTemplate); @@ -1264,6 +1265,16 @@ class TestSymbolDatabase : public TestFixture { ASSERT(p->valueType()->pointer == 1); } + void VariableValueType6() { + GET_SYMBOL_DB("struct Data{};\n" + "void foo() { std::unique_ptr data = std::unique_ptr(new Data); }"); + + const Token* check = Token::findsimplematch(tokenizer.tokens(), "( new"); + ASSERT(check); + ASSERT(check->valueType()); + ASSERT(check->valueType()->smartPointerTypeToken); + } + void VariableValueTypeReferences() { { GET_SYMBOL_DB("void foo(int x) {}\n"); diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index d8efbd702d4..e5d0b6ad99f 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -6552,7 +6552,6 @@ class TestUnusedVar : public TestFixture { " auto a2 = std::unique_ptr(new A());\n" "}\n"); ASSERT_EQUALS("[test.cpp:7]: (style) Variable 'a' is assigned a value that is never used.\n" - "[test.cpp:8]: (style) Variable 'a2' is assigned a value that is never used.\n" "[test.cpp:8]: (style) Variable 'a2' is assigned a value that is never used.\n", // duplicate errout_str());