Skip to content

Commit

Permalink
Fix #12999: Improve smart_pointer ValueType assignment (danmar#6674)
Browse files Browse the repository at this point in the history
  • Loading branch information
olabetskyi committed Aug 11, 2024
1 parent aa3b8d9 commit c8cdd7a
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 3 deletions.
4 changes: 2 additions & 2 deletions lib/symboldatabase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
11 changes: 11 additions & 0 deletions test/testsymboldatabase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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> data = std::unique_ptr<Data>(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");
Expand Down
1 change: 0 additions & 1 deletion test/testunusedvar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6552,7 +6552,6 @@ class TestUnusedVar : public TestFixture {
" auto a2 = std::unique_ptr<A>(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());

Expand Down

0 comments on commit c8cdd7a

Please sign in to comment.