@@ -7304,7 +7304,57 @@ static const Token* parsedecl(const Token* type,
73047304 if (valuetype->typeScope )
73057305 valuetype->type = (scope->type == ScopeType::eClass) ? ValueType::Type::RECORD : ValueType::Type::NONSTD;
73067306 }
7307- } else if (const Library::Container* container = (cpp ? settings.library .detectContainerOrIterator (type, &isIterator) : nullptr )) {
7307+ } else if (ValueType::Type::UNKNOWN_TYPE != ValueType::typeFromString (type->str (), type->isLong ())) {
7308+ const ValueType::Type t0 = valuetype->type ;
7309+ valuetype->type = ValueType::typeFromString (type->str (), type->isLong ());
7310+ if (t0 == ValueType::Type::LONG) {
7311+ if (valuetype->type == ValueType::Type::LONG)
7312+ valuetype->type = ValueType::Type::LONGLONG;
7313+ else if (valuetype->type == ValueType::Type::DOUBLE)
7314+ valuetype->type = ValueType::Type::LONGDOUBLE;
7315+ }
7316+ } else if (type->str () == " auto" ) {
7317+ const ValueType *vt = type->valueType ();
7318+ if (!vt)
7319+ return nullptr ;
7320+ valuetype->type = vt->type ;
7321+ valuetype->pointer = vt->pointer ;
7322+ valuetype->reference = vt->reference ;
7323+ if (vt->sign != ValueType::Sign::UNKNOWN_SIGN)
7324+ valuetype->sign = vt->sign ;
7325+ valuetype->constness = vt->constness ;
7326+ valuetype->volatileness = vt->volatileness ;
7327+ valuetype->originalTypeName = vt->originalTypeName ;
7328+ const bool hasConst = Token::simpleMatch (type->previous (), " const" );
7329+ const bool hasVolatile = Token::simpleMatch (type->previous (), " volatile" );
7330+ while (Token::Match (type, " %name%|*|&|&&|::" ) && !type->variable ()) {
7331+ if (type->str () == " *" ) {
7332+ valuetype->pointer = 1 ;
7333+ if (hasConst)
7334+ valuetype->constness = 1 ;
7335+ if (hasVolatile)
7336+ valuetype->volatileness = 1 ;
7337+ } else if (type->str () == " &" ) {
7338+ valuetype->reference = Reference::LValue;
7339+ } else if (type->str () == " &&" ) {
7340+ valuetype->reference = Reference::RValue;
7341+ }
7342+ if (type->str () == " const" )
7343+ valuetype->constness |= (1 << valuetype->pointer );
7344+ if (type->str () == " volatile" )
7345+ valuetype->volatileness |= (1 << valuetype->pointer );
7346+ type = type->next ();
7347+ }
7348+ break ;
7349+ } else if (type->str () == " *" )
7350+ valuetype->pointer ++;
7351+ else if (type->str () == " &" )
7352+ valuetype->reference = Reference::LValue;
7353+ else if (type->str () == " &&" )
7354+ valuetype->reference = Reference::RValue;
7355+ else if (type->isStandardType ())
7356+ valuetype->fromLibraryType (type->str (), settings);
7357+ else if (const Library::Container* container = (cpp ? settings.library .detectContainerOrIterator (type, &isIterator) : nullptr )) {
73087358 if (isIterator)
73097359 valuetype->type = ValueType::Type::ITERATOR;
73107360 else
@@ -7348,48 +7398,6 @@ static const Token* parsedecl(const Token* type,
73487398 typestr += end->str ();
73497399 if (valuetype->fromLibraryType (typestr, settings))
73507400 type = end;
7351- } else if (ValueType::Type::UNKNOWN_TYPE != ValueType::typeFromString (type->str (), type->isLong ())) {
7352- const ValueType::Type t0 = valuetype->type ;
7353- valuetype->type = ValueType::typeFromString (type->str (), type->isLong ());
7354- if (t0 == ValueType::Type::LONG) {
7355- if (valuetype->type == ValueType::Type::LONG)
7356- valuetype->type = ValueType::Type::LONGLONG;
7357- else if (valuetype->type == ValueType::Type::DOUBLE)
7358- valuetype->type = ValueType::Type::LONGDOUBLE;
7359- }
7360- } else if (type->str () == " auto" ) {
7361- const ValueType *vt = type->valueType ();
7362- if (!vt)
7363- return nullptr ;
7364- valuetype->type = vt->type ;
7365- valuetype->pointer = vt->pointer ;
7366- valuetype->reference = vt->reference ;
7367- if (vt->sign != ValueType::Sign::UNKNOWN_SIGN)
7368- valuetype->sign = vt->sign ;
7369- valuetype->constness = vt->constness ;
7370- valuetype->volatileness = vt->volatileness ;
7371- valuetype->originalTypeName = vt->originalTypeName ;
7372- const bool hasConst = Token::simpleMatch (type->previous (), " const" );
7373- const bool hasVolatile = Token::simpleMatch (type->previous (), " volatile" );
7374- while (Token::Match (type, " %name%|*|&|&&|::" ) && !type->variable ()) {
7375- if (type->str () == " *" ) {
7376- valuetype->pointer = 1 ;
7377- if (hasConst)
7378- valuetype->constness = 1 ;
7379- if (hasVolatile)
7380- valuetype->volatileness = 1 ;
7381- } else if (type->str () == " &" ) {
7382- valuetype->reference = Reference::LValue;
7383- } else if (type->str () == " &&" ) {
7384- valuetype->reference = Reference::RValue;
7385- }
7386- if (type->str () == " const" )
7387- valuetype->constness |= (1 << valuetype->pointer );
7388- if (type->str () == " volatile" )
7389- valuetype->volatileness |= (1 << valuetype->pointer );
7390- type = type->next ();
7391- }
7392- break ;
73937401 } else if (!valuetype->typeScope && (type->str () == " struct" || type->str () == " enum" ) && valuetype->type != ValueType::Type::SMART_POINTER)
73947402 valuetype->type = type->str () == " struct" ? ValueType::Type::RECORD : ValueType::Type::NONSTD;
73957403 else if (!valuetype->typeScope && type->type () && type->type ()->classScope && valuetype->type != ValueType::Type::SMART_POINTER) {
@@ -7402,14 +7410,6 @@ static const Token* parsedecl(const Token* type,
74027410 valuetype->typeScope = type->type ()->classScope ;
74037411 } else if (type->isName () && valuetype->sign != ValueType::Sign::UNKNOWN_SIGN && valuetype->pointer == 0U )
74047412 return nullptr ;
7405- else if (type->str () == " *" )
7406- valuetype->pointer ++;
7407- else if (type->str () == " &" )
7408- valuetype->reference = Reference::LValue;
7409- else if (type->str () == " &&" )
7410- valuetype->reference = Reference::RValue;
7411- else if (type->isStandardType ())
7412- valuetype->fromLibraryType (type->str (), settings);
74137413 else if (Token::Match (type->previous (), " !!:: %name% !!::" ))
74147414 valuetype->fromLibraryType (type->str (), settings);
74157415 if (!type->originalName ().empty ())
0 commit comments