Skip to content

Commit bf7ef56

Browse files
IOBYTEdanmar
authored andcommitted
Fixed danmar#7713 (False positive: %hhu in format string (no. 1) requires 'unsigned char' but the argument type is 'signed int'.)
1 parent 87409ea commit bf7ef56

File tree

2 files changed

+36
-3
lines changed

2 files changed

+36
-3
lines changed

lib/symboldatabase.cpp

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4406,9 +4406,29 @@ static const Token * parsedecl(const Token *type, ValueType * const valuetype, V
44064406
valuetype->sign = ValueType::Sign::UNKNOWN_SIGN;
44074407
if (!valuetype->typeScope)
44084408
valuetype->type = ValueType::Type::UNKNOWN_TYPE;
4409-
else if (valuetype->typeScope->type == Scope::eEnum)
4410-
valuetype->type = ValueType::Type::INT;
4411-
else
4409+
else if (valuetype->typeScope->type == Scope::eEnum) {
4410+
const Token * enum_type = valuetype->typeScope->enumType;
4411+
if (enum_type) {
4412+
if (enum_type->isSigned())
4413+
valuetype->sign = ValueType::Sign::SIGNED;
4414+
else if (enum_type->isUnsigned())
4415+
valuetype->sign = ValueType::Sign::UNSIGNED;
4416+
else
4417+
valuetype->sign = defaultSignedness;
4418+
if (enum_type->str() == "char")
4419+
valuetype->type = ValueType::Type::CHAR;
4420+
else if (enum_type->str() == "short")
4421+
valuetype->type = ValueType::Type::SHORT;
4422+
else if (enum_type->str() == "int")
4423+
valuetype->type = ValueType::Type::INT;
4424+
else if (enum_type->str() == "long")
4425+
valuetype->type = enum_type->isLong() ? ValueType::Type::LONGLONG : ValueType::Type::LONG;
4426+
else if (enum_type->isStandardType()) {
4427+
valuetype->fromLibraryType(enum_type->str(), settings);
4428+
}
4429+
} else
4430+
valuetype->type = ValueType::Type::INT;
4431+
} else
44124432
valuetype->type = ValueType::Type::NONSTD;
44134433
while (Token::Match(type, "%name%|*|&|::") && !type->variable()) {
44144434
if (type->isSigned())

test/testsymboldatabase.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4009,6 +4009,19 @@ class TestSymbolDatabase: public TestFixture {
40094009
// Pointer to unknown type
40104010
ASSERT_EQUALS("*", typeOf("Bar* b;", "b"));
40114011

4012+
// Enum
4013+
ASSERT_EQUALS("char", typeOf("enum E : char { }; void foo() { E e[3]; bar(e[0]); }", "[ 0"));
4014+
ASSERT_EQUALS("signed char", typeOf("enum E : signed char { }; void foo() { E e[3]; bar(e[0]); }", "[ 0"));
4015+
ASSERT_EQUALS("unsigned char", typeOf("enum E : unsigned char { }; void foo() { E e[3]; bar(e[0]); }", "[ 0"));
4016+
ASSERT_EQUALS("signed short", typeOf("enum E : short { }; void foo() { E e[3]; bar(e[0]); }", "[ 0"));
4017+
ASSERT_EQUALS("unsigned short", typeOf("enum E : unsigned short { }; void foo() { E e[3]; bar(e[0]); }", "[ 0"));
4018+
ASSERT_EQUALS("signed int", typeOf("enum E : int { }; void foo() { E e[3]; bar(e[0]); }", "[ 0"));
4019+
ASSERT_EQUALS("unsigned int", typeOf("enum E : unsigned int { }; void foo() { E e[3]; bar(e[0]); }", "[ 0"));
4020+
ASSERT_EQUALS("signed long", typeOf("enum E : long { }; void foo() { E e[3]; bar(e[0]); }", "[ 0"));
4021+
ASSERT_EQUALS("unsigned long", typeOf("enum E : unsigned long { }; void foo() { E e[3]; bar(e[0]); }", "[ 0"));
4022+
ASSERT_EQUALS("signed long long", typeOf("enum E : long long { }; void foo() { E e[3]; bar(e[0]); }", "[ 0"));
4023+
ASSERT_EQUALS("unsigned long long", typeOf("enum E : unsigned long long { }; void foo() { E e[3]; bar(e[0]); }", "[ 0"));
4024+
40124025
// Library types
40134026
{
40144027
// PodType

0 commit comments

Comments
 (0)