//--------------------------------------------------------------------------- // catch(const exception & err) // { // throw err; // <- should be just "throw;" // } //--------------------------------------------------------------------------- void CheckExceptionSafety::checkRethrowCopy() { if (!_settings->isEnabled("style")) return; const char catchPattern1[] = "catch ("; const char catchPattern2[] = "%var% ) { %any%"; const Token* tok = Token::findsimplematch(_tokenizer->tokens(), catchPattern1); while (tok) { const Token* endScopeTok = tok->next(); const Token* endBracketTok = tok->next()->link(); if (endBracketTok && Token::Match(endBracketTok->previous(), catchPattern2)) { const Token* startScopeTok = endBracketTok->next(); endScopeTok = startScopeTok->link(); const unsigned int varid = endBracketTok->previous()->varId(); if (varid > 0) { const Token* rethrowTok = Token::findmatch(startScopeTok->next(), "throw %varid%", endScopeTok->previous(), varid); if (rethrowTok) { rethrowCopyError(rethrowTok, endBracketTok->strAt(-1)); } } } tok = Token::findsimplematch(endScopeTok->next(), catchPattern1); } }
//--------------------------------------------------------------------------- // catch(const exception & err) // { // throw err; // <- should be just "throw;" // } //--------------------------------------------------------------------------- void CheckExceptionSafety::checkRethrowCopy() { if (!_settings->isEnabled("style")) return; const SymbolDatabase* const symbolDatabase = _tokenizer->getSymbolDatabase(); for (std::list<Scope>::const_iterator i = symbolDatabase->scopeList.begin(); i != symbolDatabase->scopeList.end(); ++i) { if (i->type != Scope::eCatch) continue; const unsigned int varid = i->classStart->tokAt(-2)->varId(); if (varid) { const Token* rethrowTok = Token::findmatch(i->classStart->next(), "throw %varid% ;", i->classEnd->previous(), varid); if (rethrowTok) rethrowCopyError(rethrowTok, rethrowTok->strAt(1)); } } }
//--------------------------------------------------------------------------- // catch(const exception & err) // { // throw err; // <- should be just "throw;" // } //--------------------------------------------------------------------------- void CheckExceptionSafety::checkRethrowCopy() { const SymbolDatabase* const symbolDatabase = _tokenizer->getSymbolDatabase(); for (std::list<Scope>::const_iterator i = symbolDatabase->scopeList.begin(); i != symbolDatabase->scopeList.end(); ++i) { if (i->type != Scope::eCatch) continue; const unsigned int varid = i->classStart->tokAt(-2)->varId(); if (varid) { for (const Token* tok = i->classStart->next(); tok && tok != i->classEnd; tok = tok->next()) { if (Token::simpleMatch(tok, "catch (") && tok->next()->link() && tok->next()->link()->next()) // Don't check inner catch - it is handled in another iteration of outer loop. tok = tok->next()->link()->next()->link(); else if (tok && Token::Match(tok, "throw %varid% ;", varid)) rethrowCopyError(tok, tok->strAt(1)); } } } }