| 1369 | /// @todo add non-string literals, and generic expressions |
| 1370 | |
| 1371 | CheckIOImpl::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); |
nothing calls this directly
no test coverage detected