Patch from Dmitry-Me: reorder checks so that cheaper ones go first, reuse previously computed values, return early on edge condition

This commit is contained in:
Alexander Mai 2014-06-16 21:36:31 +02:00
parent c61d2b9f41
commit 2e3f26ba58
2 changed files with 14 additions and 12 deletions

View File

@ -7316,8 +7316,9 @@ void Tokenizer::simplifyEnum()
tok = tok->previous(); tok = tok->previous();
} }
if (Token::Match(tok, "class|struct|namespace") && tok->next() && if (tok && tok->next() &&
(!tok->previous() || (tok->previous() && tok->previous()->str() != "enum"))) { (!tok->previous() || (tok->previous()->str() != "enum")) &&
Token::Match(tok, "class|struct|namespace")) {
className = tok->next()->str(); className = tok->next()->str();
classLevel = 0; classLevel = 0;
} else if (tok->str() == "}") { } else if (tok->str() == "}") {
@ -7347,8 +7348,8 @@ void Tokenizer::simplifyEnum()
// check for name // check for name
if (tok->next()->isName()) { if (tok->next()->isName()) {
enumType = tok->next();
tok = tok->next(); tok = tok->next();
enumType = tok;
} }
// check for C++0x typed enumeration // check for C++0x typed enumeration
@ -7360,8 +7361,8 @@ void Tokenizer::simplifyEnum()
return; // can't recover return; // can't recover
} }
typeTokenStart = tok->next();
tok = tok->next(); tok = tok->next();
typeTokenStart = tok;
typeTokenEnd = typeTokenStart; typeTokenEnd = typeTokenStart;
while (typeTokenEnd->next() && (typeTokenEnd->next()->str() == "::" || while (typeTokenEnd->next() && (typeTokenEnd->next()->str() == "::" ||
@ -7504,6 +7505,9 @@ void Tokenizer::simplifyEnum()
// Substitute enum values // Substitute enum values
{ {
if (!tok1)
return;
if (_settings->terminated()) if (_settings->terminated())
return; return;
@ -7520,8 +7524,6 @@ void Tokenizer::simplifyEnum()
bool simplify = false; bool simplify = false;
EnumValue *ev = nullptr; EnumValue *ev = nullptr;
if (!tok1)
return;
for (Token *tok2 = tok1->next(); tok2; tok2 = tok2->next()) { for (Token *tok2 = tok1->next(); tok2; tok2 = tok2->next()) {
if (tok2->str() == "}") { if (tok2->str() == "}") {
--level; --level;

View File

@ -1323,10 +1323,10 @@ private:
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
} }
template<size_t n, typename T> template<size_t n, typename T>
size_t getArraylength( const T(&)[n]) { size_t getArraylength(const T(&)[n]) {
return n; return n;
} }
void stlBoundaries1() { void stlBoundaries1() {
const std::string stlCont[] = { const std::string stlCont[] = {
@ -1351,8 +1351,8 @@ private:
"}"); "}");
ASSERT_EQUALS("[test.cpp:3]: (error) Dangerous iterator comparison using operator< on 'std::forward_list'.\n", errout.str()); ASSERT_EQUALS("[test.cpp:3]: (error) Dangerous iterator comparison using operator< on 'std::forward_list'.\n", errout.str());
// #5926 no FP Dangerous iterator comparison using operator< on 'std::deque'. // #5926 no FP Dangerous iterator comparison using operator< on 'std::deque'.
check("void f() {\n" check("void f() {\n"
" std::deque<int>::iterator it;\n" " std::deque<int>::iterator it;\n"
" for (it = ab.begin(); ab.end() > it; ++it) {}\n" " for (it = ab.begin(); ab.end() > it; ++it) {}\n"
"}"); "}");