| 1287 | } |
| 1288 | |
| 1289 | void 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; |
nothing calls this directly
no test coverage detected