Ticket #8281, #8417: Properly detect the end of "switch" statements to accept all legitimate uses of "case". (#1112)
This commit is contained in:
parent
5384802e16
commit
9fade65dbb
@ -8352,16 +8352,26 @@ void Tokenizer::findGarbageCode() const
|
|||||||
if (Token::simpleMatch(tok, "switch (")) {
|
if (Token::simpleMatch(tok, "switch (")) {
|
||||||
if (Token::simpleMatch(tok->linkAt(1), ") {")) {
|
if (Token::simpleMatch(tok->linkAt(1), ") {")) {
|
||||||
tok = tok->linkAt(1)->linkAt(1);
|
tok = tok->linkAt(1)->linkAt(1);
|
||||||
} else {
|
continue;
|
||||||
|
}
|
||||||
const Token *switchToken = tok;
|
const Token *switchToken = tok;
|
||||||
tok = tok->linkAt(1);
|
tok = tok->linkAt(1);
|
||||||
while (tok && !Token::Match(tok, "[;{}]"))
|
|
||||||
tok = tok->next();
|
|
||||||
if (!tok)
|
if (!tok)
|
||||||
syntaxError(switchToken);
|
syntaxError(switchToken);
|
||||||
if (tok->str() != ";")
|
// Look for the end of the switch statement, i.e. the first semi-colon or '}'
|
||||||
syntaxError(tok);
|
for ( ; tok ; tok = tok->next()) {
|
||||||
|
if (tok->str() == "{") {
|
||||||
|
tok = tok->link();
|
||||||
}
|
}
|
||||||
|
if (Token::Match(tok, ";|}")) {
|
||||||
|
// We're at the end of the switch block
|
||||||
|
if (tok->str() == "}" && tok->strAt(-1) == ":") // Invalid case
|
||||||
|
syntaxError(switchToken);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!tok)
|
||||||
|
break;
|
||||||
} else if (tok->str() == "(") {
|
} else if (tok->str() == "(") {
|
||||||
tok = tok->link();
|
tok = tok->link();
|
||||||
} else if (tok->str() == "case") {
|
} else if (tok->str() == "case") {
|
||||||
|
@ -4776,6 +4776,24 @@ private:
|
|||||||
//ticket #8477
|
//ticket #8477
|
||||||
ASSERT_EQUALS("void foo ( ) { enum Anonymous0 : int { Six = 6 } ; return Six ; }",
|
ASSERT_EQUALS("void foo ( ) { enum Anonymous0 : int { Six = 6 } ; return Six ; }",
|
||||||
tokenizeAndStringify("void foo () { enum : int { Six = 6 } ; return Six ; }"));
|
tokenizeAndStringify("void foo () { enum : int { Six = 6 } ; return Six ; }"));
|
||||||
|
// ticket #8281
|
||||||
|
tokenizeAndStringify("void lzma_decode(int i) { "
|
||||||
|
" bool state; "
|
||||||
|
" switch (i) "
|
||||||
|
" while (true) { "
|
||||||
|
" state=false; "
|
||||||
|
" case 1: "
|
||||||
|
" ; "
|
||||||
|
" }"
|
||||||
|
"}");
|
||||||
|
// ticket #8417
|
||||||
|
tokenizeAndStringify("void printOwnedAttributes(int mode) { "
|
||||||
|
" switch(mode) case 0: { break; } "
|
||||||
|
"}");
|
||||||
|
ASSERT_THROW(tokenizeAndStringify("void printOwnedAttributes(int mode) { "
|
||||||
|
" switch(mode) case 0: { break; } case 1: ; "
|
||||||
|
"}"),
|
||||||
|
InternalError);
|
||||||
}
|
}
|
||||||
|
|
||||||
void simplifyPointerToStandardType() {
|
void simplifyPointerToStandardType() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user