Refactorized switchCaseFallThrough: Removed lots of obsolete code
This commit is contained in:
parent
66329fe8b8
commit
20c3a5baf0
|
@ -980,70 +980,35 @@ void CheckOther::checkSwitchCaseFallThrough()
|
||||||
|
|
||||||
const SymbolDatabase* const symbolDatabase = _tokenizer->getSymbolDatabase();
|
const SymbolDatabase* const symbolDatabase = _tokenizer->getSymbolDatabase();
|
||||||
|
|
||||||
if (!symbolDatabase)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (std::list<Scope>::const_iterator i = symbolDatabase->scopeList.begin(); i != symbolDatabase->scopeList.end(); ++i) {
|
for (std::list<Scope>::const_iterator i = symbolDatabase->scopeList.begin(); i != symbolDatabase->scopeList.end(); ++i) {
|
||||||
if (i->type != Scope::eSwitch || !i->classStart) // Find the beginning of a switch
|
if (i->type != Scope::eSwitch || !i->classStart) // Find the beginning of a switch
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Check the contents of the switch statement
|
// Check the contents of the switch statement
|
||||||
std::stack<std::pair<Token *, bool> > ifnest;
|
std::stack<std::pair<Token *, bool> > ifnest;
|
||||||
std::stack<Token *> loopnest;
|
|
||||||
std::stack<Token *> scopenest;
|
|
||||||
bool justbreak = true;
|
bool justbreak = true;
|
||||||
bool firstcase = true;
|
bool firstcase = true;
|
||||||
for (const Token *tok2 = i->classStart; tok2 != i->classEnd; tok2 = tok2->next()) {
|
for (const Token *tok2 = i->classStart; tok2 != i->classEnd; tok2 = tok2->next()) {
|
||||||
if (Token::simpleMatch(tok2, "if (")) {
|
if (Token::simpleMatch(tok2, "if (")) {
|
||||||
tok2 = tok2->next()->link()->next();
|
tok2 = tok2->next()->link()->next();
|
||||||
if (tok2->link() == nullptr) {
|
|
||||||
std::ostringstream errmsg;
|
|
||||||
errmsg << "unmatched if in switch: " << tok2->linenr();
|
|
||||||
reportError(_tokenizer->tokens(), Severity::debug, "debug", errmsg.str());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
ifnest.push(std::make_pair(tok2->link(), false));
|
ifnest.push(std::make_pair(tok2->link(), false));
|
||||||
justbreak = false;
|
justbreak = false;
|
||||||
} else if (Token::simpleMatch(tok2, "while (")) {
|
} else if (Token::simpleMatch(tok2, "while (")) {
|
||||||
tok2 = tok2->next()->link()->next();
|
tok2 = tok2->next()->link()->next();
|
||||||
// skip over "do { } while ( ) ;" case
|
if (tok2->link()) // skip over "do { } while ( ) ;" case
|
||||||
if (tok2->str() == "{") {
|
tok2 = tok2->link();
|
||||||
if (tok2->link() == nullptr) {
|
|
||||||
std::ostringstream errmsg;
|
|
||||||
errmsg << "unmatched while in switch: " << tok2->linenr();
|
|
||||||
reportError(_tokenizer->tokens(), Severity::debug, "debug", errmsg.str());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
loopnest.push(tok2->link());
|
|
||||||
}
|
|
||||||
justbreak = false;
|
justbreak = false;
|
||||||
} else if (Token::simpleMatch(tok2, "do {")) {
|
} else if (Token::simpleMatch(tok2, "do {")) {
|
||||||
tok2 = tok2->next();
|
tok2 = tok2->next()->link();
|
||||||
if (tok2->link() == nullptr) {
|
|
||||||
std::ostringstream errmsg;
|
|
||||||
errmsg << "unmatched do in switch: " << tok2->linenr();
|
|
||||||
reportError(_tokenizer->tokens(), Severity::debug, "debug", errmsg.str());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
loopnest.push(tok2->link());
|
|
||||||
justbreak = false;
|
justbreak = false;
|
||||||
} else if (Token::simpleMatch(tok2, "for (")) {
|
} else if (Token::simpleMatch(tok2, "for (")) {
|
||||||
tok2 = tok2->next()->link()->next();
|
tok2 = tok2->next()->link()->next()->link();
|
||||||
if (tok2->link() == nullptr) {
|
|
||||||
std::ostringstream errmsg;
|
|
||||||
errmsg << "unmatched for in switch: " << tok2->linenr();
|
|
||||||
reportError(_tokenizer->tokens(), Severity::debug, "debug", errmsg.str());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
loopnest.push(tok2->link());
|
|
||||||
justbreak = false;
|
justbreak = false;
|
||||||
} else if (Token::simpleMatch(tok2, "switch (")) {
|
} else if (Token::simpleMatch(tok2, "switch (")) {
|
||||||
// skip over nested switch, we'll come to that soon
|
// skip over nested switch, we'll come to that soon
|
||||||
tok2 = tok2->next()->link()->next()->link();
|
tok2 = tok2->next()->link()->next()->link();
|
||||||
} else if (Token::Match(tok2, "break|continue|return|exit|goto|throw")) {
|
} else if (Token::Match(tok2, "break|continue|return|exit|goto|throw")) {
|
||||||
if (loopnest.empty()) {
|
justbreak = true;
|
||||||
justbreak = true;
|
|
||||||
}
|
|
||||||
tok2 = Token::findsimplematch(tok2, ";");
|
tok2 = Token::findsimplematch(tok2, ";");
|
||||||
} else if (Token::Match(tok2, "case|default")) {
|
} else if (Token::Match(tok2, "case|default")) {
|
||||||
if (!justbreak && !firstcase) {
|
if (!justbreak && !firstcase) {
|
||||||
|
@ -1052,51 +1017,21 @@ void CheckOther::checkSwitchCaseFallThrough()
|
||||||
tok2 = Token::findsimplematch(tok2, ":");
|
tok2 = Token::findsimplematch(tok2, ":");
|
||||||
justbreak = true;
|
justbreak = true;
|
||||||
firstcase = false;
|
firstcase = false;
|
||||||
} else if (tok2->str() == "{") {
|
|
||||||
scopenest.push(tok2->link());
|
|
||||||
} else if (tok2->str() == "}") {
|
} else if (tok2->str() == "}") {
|
||||||
if (!ifnest.empty() && tok2 == ifnest.top().first) {
|
if (!ifnest.empty() && tok2 == ifnest.top().first) {
|
||||||
if (tok2->next()->str() == "else") {
|
if (tok2->next()->str() == "else") {
|
||||||
tok2 = tok2->tokAt(2);
|
tok2 = tok2->tokAt(2);
|
||||||
ifnest.pop();
|
ifnest.pop();
|
||||||
if (tok2->link() == nullptr) {
|
|
||||||
std::ostringstream errmsg;
|
|
||||||
errmsg << "unmatched if in switch: " << tok2->linenr();
|
|
||||||
reportError(_tokenizer->tokens(), Severity::debug, "debug", errmsg.str());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
ifnest.push(std::make_pair(tok2->link(), justbreak));
|
ifnest.push(std::make_pair(tok2->link(), justbreak));
|
||||||
justbreak = false;
|
justbreak = false;
|
||||||
} else {
|
} else {
|
||||||
justbreak &= ifnest.top().second;
|
justbreak &= ifnest.top().second;
|
||||||
ifnest.pop();
|
ifnest.pop();
|
||||||
}
|
}
|
||||||
} else if (!loopnest.empty() && tok2 == loopnest.top()) {
|
|
||||||
loopnest.pop();
|
|
||||||
} else if (!scopenest.empty() && tok2 == scopenest.top()) {
|
|
||||||
scopenest.pop();
|
|
||||||
} else {
|
|
||||||
if (!ifnest.empty() || !loopnest.empty() || !scopenest.empty()) {
|
|
||||||
std::ostringstream errmsg;
|
|
||||||
errmsg << "unexpected end of switch: ";
|
|
||||||
errmsg << "ifnest=" << ifnest.size();
|
|
||||||
if (!ifnest.empty())
|
|
||||||
errmsg << "," << ifnest.top().first->linenr();
|
|
||||||
errmsg << ", loopnest=" << loopnest.size();
|
|
||||||
if (!loopnest.empty())
|
|
||||||
errmsg << "," << loopnest.top()->linenr();
|
|
||||||
errmsg << ", scopenest=" << scopenest.size();
|
|
||||||
if (!scopenest.empty())
|
|
||||||
errmsg << "," << scopenest.top()->linenr();
|
|
||||||
reportError(_tokenizer->tokens(), Severity::debug, "debug", errmsg.str());
|
|
||||||
}
|
|
||||||
// end of switch block
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
} else if (tok2->str() != ";") {
|
} else if (tok2->str() != ";") {
|
||||||
justbreak = false;
|
justbreak = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue