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

Method ArgumentInfo

lib/checkio.cpp:1371–1583  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1369/// @todo add non-string literals, and generic expressions
1370
1371CheckIOImpl::ArgumentInfo::ArgumentInfo(const Token * arg, const Settings &settings, bool _isCPP)
1372 : isCPP(_isCPP)
1373{
1374 if (!arg)
1375 return;
1376
1377 // Use AST type info
1378 // TODO: This is a bailout so that old code is used in simple cases. Remove the old code and always use the AST type.
1379 if (!Token::Match(arg, "%str% ,|)") && !(arg->variable() && arg->variable()->isArray())) {
1380 const Token *top = arg;
1381 while (top->str() == "(" && !top->isCast())
1382 top = top->next();
1383 while (top->astParent() && top->astParent()->str() != "," && top->astParent() != arg->previous())
1384 top = top->astParent();
1385 const ValueType *valuetype = top->argumentType();
1386 if (valuetype && valuetype->type >= ValueType::Type::BOOL) {
1387 typeToken = tempToken = new Token(top);
1388 if (valuetype->pointer && valuetype->constness & 1) {
1389 tempToken->str("const");
1390 tempToken->insertToken("a");
1391 tempToken = tempToken->next();
1392 }
1393 if (valuetype->type == ValueType::BOOL)
1394 tempToken->str("bool");
1395 else if (valuetype->type == ValueType::CHAR)
1396 tempToken->str("char");
1397 else if (valuetype->type == ValueType::SHORT)
1398 tempToken->str("short");
1399 else if (valuetype->type == ValueType::WCHAR_T)
1400 tempToken->str("wchar_t");
1401 else if (valuetype->type == ValueType::INT)
1402 tempToken->str("int");
1403 else if (valuetype->type == ValueType::LONG)
1404 tempToken->str("long");
1405 else if (valuetype->type == ValueType::LONGLONG) {
1406 tempToken->str("long");
1407 tempToken->isLong(true);
1408 } else if (valuetype->type == ValueType::FLOAT)
1409 tempToken->str("float");
1410 else if (valuetype->type == ValueType::DOUBLE)
1411 tempToken->str("double");
1412 else if (valuetype->type == ValueType::LONGDOUBLE) {
1413 tempToken->str("double");
1414 tempToken->isLong(true);
1415 }
1416 if (valuetype->isIntegral()) {
1417 if (valuetype->sign == ValueType::Sign::UNSIGNED)
1418 tempToken->isUnsigned(true);
1419 else if (valuetype->sign == ValueType::Sign::SIGNED)
1420 tempToken->isSigned(true);
1421 }
1422 if (!valuetype->originalTypeName.empty())
1423 tempToken->originalName(valuetype->originalTypeName);
1424 for (int p = 0; p < valuetype->pointer; p++)
1425 tempToken->insertToken("*");
1426 tempToken = const_cast<Token*>(typeToken);
1427 if (top->isBinaryOp() && Token::Match(top, "[+-]") && valuetype->pointer == 1 && (valuetype->type == ValueType::CHAR || valuetype->type == ValueType::WCHAR_T))
1428 tempToken->tokType(Token::eString);

Callers

nothing calls this directly

Calls 15

variableMethod · 0.80
isArrayMethod · 0.80
isCastMethod · 0.80
nextMethod · 0.80
astParentMethod · 0.80
insertTokenMethod · 0.80
isIntegralMethod · 0.80
isUnsignedMethod · 0.80
isBinaryOpMethod · 0.80
linkAtMethod · 0.80
isEnumTypeMethod · 0.80
typeMethod · 0.80

Tested by

no test coverage detected