From f01783238e124da32cde1369f15375466b904018 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sat, 4 Apr 2020 20:03:48 +0200 Subject: [PATCH] Fixed #9596 (False positive: Returning an integer in a function with a pointer return type auto handling) --- lib/symboldatabase.cpp | 7 +++++- test/testsymboldatabase.cpp | 45 +++++++++++++++++++++++++------------ 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index e68d62eb8..38a6304a1 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -5685,8 +5685,13 @@ static const Token * parsedecl(const Token *type, ValueType * const valuetype, V valuetype->sign = vt->sign; valuetype->constness = vt->constness; valuetype->originalTypeName = vt->originalTypeName; - while (Token::Match(type, "%name%|*|&|::") && !type->variable()) + while (Token::Match(type, "%name%|*|&|::") && !type->variable()) { + if (type->str() == "*") + valuetype->pointer++; + if (type->str() == "const") + valuetype->constness |= (1 << valuetype->pointer); type = type->next(); + } break; } else if (!valuetype->typeScope && (type->str() == "struct" || type->str() == "enum")) valuetype->type = type->str() == "struct" ? ValueType::Type::RECORD : ValueType::Type::NONSTD; diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index d4d7d467f..54e2787a4 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -418,6 +418,7 @@ private: TEST_CASE(auto10); // #8020 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(unionWithConstructor); @@ -7464,22 +7465,19 @@ private: // auto = int, v11 = int autotok = Token::findsimplematch(autotok, "auto v11"); ASSERT(autotok); - TODO_ASSERT(autotok->valueType()); - if (autotok->valueType()) { - ASSERT_EQUALS(0, autotok->valueType()->constness); - ASSERT_EQUALS(0, autotok->valueType()->pointer); - ASSERT_EQUALS(ValueType::SIGNED, autotok->valueType()->sign); - ASSERT_EQUALS(ValueType::INT, autotok->valueType()->type); - } + ASSERT(autotok->valueType()); + ASSERT_EQUALS(0, autotok->valueType()->constness); + ASSERT_EQUALS(0, autotok->valueType()->pointer); + ASSERT_EQUALS(ValueType::SIGNED, autotok->valueType()->sign); + ASSERT_EQUALS(ValueType::INT, autotok->valueType()->type); + vartok = autotok->next(); ASSERT(autotok); - TODO_ASSERT(autotok->valueType()); - if (vartok->valueType()) { - ASSERT_EQUALS(0, vartok->valueType()->constness); - ASSERT_EQUALS(0, vartok->valueType()->pointer); - ASSERT_EQUALS(ValueType::SIGNED, vartok->valueType()->sign); - ASSERT_EQUALS(ValueType::INT, vartok->valueType()->type); - } + ASSERT(autotok->valueType()); + ASSERT_EQUALS(0, vartok->valueType()->constness); + ASSERT_EQUALS(0, vartok->valueType()->pointer); + ASSERT_EQUALS(ValueType::SIGNED, vartok->valueType()->sign); + ASSERT_EQUALS(ValueType::INT, vartok->valueType()->type); } void auto8() { @@ -7572,6 +7570,25 @@ private: ASSERT(tok && tok->valueType() && tok->valueType()->container); } + void auto13() { + GET_SYMBOL_DB("uint8_t *get();\n" + "\n" + "uint8_t *test()\n" + "{\n" + " auto *next = get();\n" + " return next;\n" + "}"); + + const Token *tok; + + tok = Token::findsimplematch(tokenizer.tokens(), "return")->next(); + ASSERT(tok); + ASSERT(tok->valueType()); + ASSERT(tok->valueType()->pointer); + ASSERT(tok->variable()->valueType()); + ASSERT(tok->variable()->valueType()->pointer); + } + void unionWithConstructor() { GET_SYMBOL_DB("union Fred {\n" " Fred(int x) : i(x) { }\n"