| 7459 | } |
| 7460 | |
| 7461 | static const Token* parsedecl(const Token* type, |
| 7462 | ValueType* const valuetype, |
| 7463 | ValueType::Sign defaultSignedness, |
| 7464 | const Settings& settings, |
| 7465 | SourceLocation loc) |
| 7466 | { |
| 7467 | if (settings.debugnormal || settings.debugwarnings) |
| 7468 | valuetype->setDebugPath(type, loc); |
| 7469 | const Token * const previousType = type; |
| 7470 | const int pointer0 = valuetype->pointer; |
| 7471 | while (Token::Match(type->previous(), "%name%") && !endsWith(type->strAt(-1), ':')) |
| 7472 | type = type->previous(); |
| 7473 | valuetype->sign = ValueType::Sign::UNKNOWN_SIGN; |
| 7474 | if (!valuetype->typeScope && !valuetype->smartPointerType) |
| 7475 | valuetype->type = ValueType::Type::UNKNOWN_TYPE; |
| 7476 | else if (valuetype->smartPointerType) |
| 7477 | valuetype->type = ValueType::Type::SMART_POINTER; |
| 7478 | else if (valuetype->typeScope->type == ScopeType::eEnum) { |
| 7479 | const Token * enum_type = valuetype->typeScope->enumType; |
| 7480 | if (enum_type) { |
| 7481 | if (enum_type->isSigned()) |
| 7482 | valuetype->sign = ValueType::Sign::SIGNED; |
| 7483 | else if (enum_type->isUnsigned()) |
| 7484 | valuetype->sign = ValueType::Sign::UNSIGNED; |
| 7485 | else |
| 7486 | valuetype->sign = defaultSignedness; // TODO: this is implementation-dependent might be separate from char |
| 7487 | const ValueType::Type t = ValueType::typeFromString(enum_type->str(), enum_type->isLong()); |
| 7488 | if (t != ValueType::Type::UNKNOWN_TYPE) |
| 7489 | valuetype->type = t; |
| 7490 | else if (enum_type->isStandardType()) |
| 7491 | valuetype->fromLibraryType(enum_type->str(), settings); |
| 7492 | } else |
| 7493 | valuetype->type = getEnumType(valuetype->typeScope, settings.platform); |
| 7494 | } else |
| 7495 | valuetype->type = ValueType::Type::RECORD; |
| 7496 | const bool cpp = type->isCpp(); |
| 7497 | bool par = false; |
| 7498 | while (Token::Match(type, "%name%|*|&|&&|::|(") && !Token::Match(type, "typename|template") && type->varId() == 0 && |
| 7499 | !type->variable() && !type->function()) { |
| 7500 | bool isIterator = false; |
| 7501 | if (type->str() == "(") { |
| 7502 | if (!Token::simpleMatch(type, "( *")) |
| 7503 | break; |
| 7504 | if (Token::Match(type->link(), ") const| {")) |
| 7505 | break; |
| 7506 | if (par) |
| 7507 | break; |
| 7508 | par = true; |
| 7509 | } |
| 7510 | if (Token::simpleMatch(type, "decltype (") && type->next()->valueType()) { |
| 7511 | const ValueType *vt2 = type->next()->valueType(); |
| 7512 | if (valuetype->sign == ValueType::Sign::UNKNOWN_SIGN) |
| 7513 | valuetype->sign = vt2->sign; |
| 7514 | if (valuetype->type == ValueType::Type::UNKNOWN_TYPE) |
| 7515 | valuetype->type = vt2->type; |
| 7516 | valuetype->constness += vt2->constness; |
| 7517 | valuetype->pointer += vt2->pointer; |
| 7518 | valuetype->reference = vt2->reference; |
no test coverage detected