@@ -6281,6 +6281,8 @@ void SymbolDatabase::setValueType(Token* tok, const Variable& var, SourceLocatio
62816281 }
62826282}
62836283
6284+ static ValueType::Type getEnumType (const Scope* scope, const cppcheck::Platform& platform);
6285+
62846286void SymbolDatabase::setValueType (Token* tok, const Enumerator& enumerator, SourceLocation loc)
62856287{
62866288 ValueType valuetype;
@@ -6307,7 +6309,7 @@ void SymbolDatabase::setValueType(Token* tok, const Enumerator& enumerator, Sour
63076309 setValueType (tok, valuetype);
63086310 } else {
63096311 valuetype.sign = ValueType::SIGNED;
6310- valuetype.type = ValueType::INT ;
6312+ valuetype.type = getEnumType (enumerator. scope , mSettings . platform ) ;
63116313 setValueType (tok, valuetype);
63126314 }
63136315}
@@ -6796,6 +6798,32 @@ void SymbolDatabase::setValueType(Token* tok, const ValueType& valuetype, Source
67966798 }
67976799}
67986800
6801+ static ValueType::Type getEnumType (const Scope* scope, const cppcheck::Platform& platform) // TODO: also determine sign?
6802+ {
6803+ ValueType::Type type = ValueType::Type::INT;
6804+ for (const Token* tok = scope->bodyStart ; tok && tok != scope->bodyEnd ; tok = tok->next ()) {
6805+ if (!tok->isAssignmentOp ())
6806+ continue ;
6807+ const Token* vTok = tok->astOperand2 ();
6808+ if (!vTok->hasKnownIntValue ()) {
6809+ if (!vTok->isLiteral ())
6810+ continue ;
6811+ if (const ValueType* vt = vTok->valueType ()) {
6812+ if ((vt->type > type && (vt->type == ValueType::Type::LONG || vt->type == ValueType::Type::LONGLONG)))
6813+ type = vt->type ;
6814+ }
6815+ continue ;
6816+ }
6817+ const MathLib::bigint value = vTok->getKnownIntValue ();
6818+ if (!platform.isIntValue (value)) {
6819+ type = ValueType::Type::LONG;
6820+ if (!platform.isLongValue (value))
6821+ type = ValueType::Type::LONGLONG;
6822+ }
6823+ }
6824+ return type;
6825+ }
6826+
67996827static const Token* parsedecl (const Token* type,
68006828 ValueType* const valuetype,
68016829 ValueType::Sign defaultSignedness,
@@ -6829,7 +6857,7 @@ static const Token* parsedecl(const Token* type,
68296857 else if (enum_type->isStandardType ())
68306858 valuetype->fromLibraryType (enum_type->str (), settings);
68316859 } else
6832- valuetype->type = ValueType::Type::INT ;
6860+ valuetype->type = getEnumType (valuetype-> typeScope , settings. platform ) ;
68336861 } else
68346862 valuetype->type = ValueType::Type::RECORD;
68356863 bool par = false ;
@@ -6976,8 +7004,8 @@ static const Token* parsedecl(const Token* type,
69767004 valuetype->type = type->str () == " struct" ? ValueType::Type::RECORD : ValueType::Type::NONSTD;
69777005 else if (!valuetype->typeScope && type->type () && type->type ()->classScope ) {
69787006 if (type->type ()->classScope ->type == Scope::ScopeType::eEnum) {
6979- valuetype->type = ValueType::Type::INT;
69807007 valuetype->sign = ValueType::Sign::SIGNED;
7008+ valuetype->type = getEnumType (type->type ()->classScope , settings.platform );
69817009 } else {
69827010 valuetype->type = ValueType::Type::RECORD;
69837011 }
0 commit comments