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

Method simplifyTemplateAliases

lib/templatesimplifier.cpp:1289–1413  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1287}
1288
1289void TemplateSimplifier::simplifyTemplateAliases()
1290{
1291 for (auto it1 = mTemplateDeclarations.cbegin(); it1 != mTemplateDeclarations.cend();) {
1292 const TokenAndName &aliasDeclaration = *it1;
1293
1294 if (!aliasDeclaration.isAlias()) {
1295 ++it1;
1296 continue;
1297 }
1298
1299 // alias parameters..
1300 std::vector<const Token *> aliasParameters;
1301 getTemplateParametersInDeclaration(aliasDeclaration.token()->tokAt(2), aliasParameters);
1302 std::map<std::string, unsigned int> aliasParameterNames;
1303 for (unsigned int argnr = 0; argnr < aliasParameters.size(); ++argnr)
1304 aliasParameterNames[aliasParameters[argnr]->str()] = argnr;
1305
1306 // Look for alias usages..
1307 bool found = false;
1308 for (auto it2 = mTemplateInstantiations.cbegin(); it2 != mTemplateInstantiations.cend();) {
1309 const TokenAndName &aliasUsage = *it2;
1310 if (!aliasUsage.token() || aliasUsage.fullName() != aliasDeclaration.fullName()) {
1311 ++it2;
1312 continue;
1313 }
1314
1315 // don't recurse
1316 if (aliasDeclaration.isAliasToken(aliasUsage.token())) {
1317 ++it2;
1318 continue;
1319 }
1320
1321 std::vector<std::pair<Token *, Token *>> args;
1322 Token *tok2 = aliasUsage.token()->tokAt(2);
1323 while (tok2) {
1324 Token * const start = tok2;
1325 while (tok2 && !Token::Match(tok2, "[,>;{}]")) {
1326 if (tok2->link() && Token::Match(tok2, "(|["))
1327 tok2 = tok2->link();
1328 else if (tok2->str() == "<") {
1329 tok2 = tok2->findClosingBracket();
1330 if (!tok2)
1331 break;
1332 }
1333 tok2 = tok2->next();
1334 }
1335
1336 args.emplace_back(start, tok2);
1337 if (tok2 && tok2->str() == ",") {
1338 tok2 = tok2->next();
1339 } else {
1340 break;
1341 }
1342 }
1343 if (!tok2 || tok2->str() != ">" ||
1344 (!aliasDeclaration.isVariadic() && (args.size() != aliasParameters.size())) ||
1345 (aliasDeclaration.isVariadic() && (args.size() < aliasParameters.size()))) {
1346 ++it2;

Callers

nothing calls this directly

Calls 15

FindTokenClass · 0.85
deleteTokenFunction · 0.85
tokenMethod · 0.80
fullNameMethod · 0.80
isAliasTokenMethod · 0.80
nextMethod · 0.80
isVariadicMethod · 0.80
aliasStartTokenMethod · 0.80
aliasEndTokenMethod · 0.80
deleteThisMethod · 0.80
scopeMethod · 0.80
frontMethod · 0.80

Tested by

no test coverage detected