MCPcopy Create free account
hub / github.com/cppcheck-opensource/cppcheck / parsedecl

Function parsedecl

lib/symboldatabase.cpp:7461–7685  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

7459}
7460
7461static 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;

Callers 3

setValueTypeMethod · 0.85
parseDeclMethod · 0.85

Calls 15

getEnumTypeFunction · 0.85
findsimplematchFunction · 0.85
setDebugPathMethod · 0.80
isUnsignedMethod · 0.80
fromLibraryTypeMethod · 0.80
variableMethod · 0.80
nextMethod · 0.80
linkAtMethod · 0.80
typeMethod · 0.80
frontMethod · 0.80
scopeMethod · 0.80

Tested by

no test coverage detected