diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index e44781a5c..8f394d925 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -4406,9 +4406,29 @@ static const Token * parsedecl(const Token *type, ValueType * const valuetype, V valuetype->sign = ValueType::Sign::UNKNOWN_SIGN; if (!valuetype->typeScope) valuetype->type = ValueType::Type::UNKNOWN_TYPE; - else if (valuetype->typeScope->type == Scope::eEnum) - valuetype->type = ValueType::Type::INT; - else + else if (valuetype->typeScope->type == Scope::eEnum) { + const Token * enum_type = valuetype->typeScope->enumType; + if (enum_type) { + if (enum_type->isSigned()) + valuetype->sign = ValueType::Sign::SIGNED; + else if (enum_type->isUnsigned()) + valuetype->sign = ValueType::Sign::UNSIGNED; + else + valuetype->sign = defaultSignedness; + if (enum_type->str() == "char") + valuetype->type = ValueType::Type::CHAR; + else if (enum_type->str() == "short") + valuetype->type = ValueType::Type::SHORT; + else if (enum_type->str() == "int") + valuetype->type = ValueType::Type::INT; + else if (enum_type->str() == "long") + valuetype->type = enum_type->isLong() ? ValueType::Type::LONGLONG : ValueType::Type::LONG; + else if (enum_type->isStandardType()) { + valuetype->fromLibraryType(enum_type->str(), settings); + } + } else + valuetype->type = ValueType::Type::INT; + } else valuetype->type = ValueType::Type::NONSTD; while (Token::Match(type, "%name%|*|&|::") && !type->variable()) { if (type->isSigned()) diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 90d2e31e1..d41735c88 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -4009,6 +4009,19 @@ private: // Pointer to unknown type ASSERT_EQUALS("*", typeOf("Bar* b;", "b")); + // Enum + ASSERT_EQUALS("char", typeOf("enum E : char { }; void foo() { E e[3]; bar(e[0]); }", "[ 0")); + ASSERT_EQUALS("signed char", typeOf("enum E : signed char { }; void foo() { E e[3]; bar(e[0]); }", "[ 0")); + ASSERT_EQUALS("unsigned char", typeOf("enum E : unsigned char { }; void foo() { E e[3]; bar(e[0]); }", "[ 0")); + ASSERT_EQUALS("signed short", typeOf("enum E : short { }; void foo() { E e[3]; bar(e[0]); }", "[ 0")); + ASSERT_EQUALS("unsigned short", typeOf("enum E : unsigned short { }; void foo() { E e[3]; bar(e[0]); }", "[ 0")); + ASSERT_EQUALS("signed int", typeOf("enum E : int { }; void foo() { E e[3]; bar(e[0]); }", "[ 0")); + ASSERT_EQUALS("unsigned int", typeOf("enum E : unsigned int { }; void foo() { E e[3]; bar(e[0]); }", "[ 0")); + ASSERT_EQUALS("signed long", typeOf("enum E : long { }; void foo() { E e[3]; bar(e[0]); }", "[ 0")); + ASSERT_EQUALS("unsigned long", typeOf("enum E : unsigned long { }; void foo() { E e[3]; bar(e[0]); }", "[ 0")); + ASSERT_EQUALS("signed long long", typeOf("enum E : long long { }; void foo() { E e[3]; bar(e[0]); }", "[ 0")); + ASSERT_EQUALS("unsigned long long", typeOf("enum E : unsigned long long { }; void foo() { E e[3]; bar(e[0]); }", "[ 0")); + // Library types { // PodType