Fixed #7747 (Syntax error when setting the bitcount of an enum defined inside a struct)
This commit is contained in:
parent
02402eeea4
commit
bcbc8ef017
|
@ -8909,6 +8909,18 @@ void Tokenizer::simplifyBitfields()
|
|||
if (!Token::Match(tok, ";|{|}|public:|protected:|private:"))
|
||||
continue;
|
||||
|
||||
bool isEnum = false;
|
||||
if (tok->str() == "}") {
|
||||
const Token *type = tok->link()->previous();
|
||||
while (type && type->isName()) {
|
||||
if (type->str() == "enum") {
|
||||
isEnum = true;
|
||||
break;
|
||||
}
|
||||
type = type->previous();
|
||||
}
|
||||
}
|
||||
|
||||
if (Token::Match(tok->next(), "const| %type% %name% :") &&
|
||||
!Token::Match(tok->next(), "case|public|protected|private|class|struct") &&
|
||||
!Token::simpleMatch(tok->tokAt(2), "default :")) {
|
||||
|
@ -8924,10 +8936,16 @@ void Tokenizer::simplifyBitfields()
|
|||
|
||||
last = tok1->next();
|
||||
}
|
||||
} else if (isEnum && Token::Match(tok, "} %name%| : %num% ;")) {
|
||||
if (tok->next()->str() == ":") {
|
||||
tok->deleteNext(2);
|
||||
tok->insertToken("Anonymous");
|
||||
} else {
|
||||
tok->next()->deleteNext(2);
|
||||
}
|
||||
} else if (Token::Match(tok->next(), "const| %type% : %num%|%bool% ;") &&
|
||||
tok->next()->str() != "default") {
|
||||
const int offset = (tok->next()->str() == "const") ? 1 : 0;
|
||||
|
||||
if (!Token::Match(tok->tokAt(3 + offset), "[{};()]")) {
|
||||
tok->deleteNext(4 + offset);
|
||||
goback = true;
|
||||
|
|
|
@ -345,6 +345,7 @@ private:
|
|||
TEST_CASE(bitfields12); // ticket #3485 (segmentation fault)
|
||||
TEST_CASE(bitfields13); // ticket #3502 (segmentation fault)
|
||||
TEST_CASE(bitfields14); // ticket #4561 (segfault for 'class a { signals: };')
|
||||
TEST_CASE(bitfields15); // ticket #7747 (enum Foo {A,B}:4;)
|
||||
|
||||
TEST_CASE(simplifyNamespaceStd);
|
||||
|
||||
|
@ -5390,6 +5391,21 @@ private:
|
|||
ASSERT_EQUALS("class x { signals : } ;", tokenizeAndStringify("class x { signals: };\n",false));
|
||||
}
|
||||
|
||||
void bitfields15() { // #7747 - enum Foo {A,B}:4;
|
||||
ASSERT_EQUALS("struct AB {\n"
|
||||
"enum Foo { A , B } ; enum Foo Anonymous ;\n"
|
||||
"} ;",
|
||||
tokenizeAndStringify("struct AB {\n"
|
||||
" enum Foo {A,B} : 4;\n"
|
||||
"};"));
|
||||
ASSERT_EQUALS("struct AB {\n"
|
||||
"enum Foo { A , B } ; enum Foo foo ;\n"
|
||||
"} ;",
|
||||
tokenizeAndStringify("struct AB {\n"
|
||||
" enum Foo {A,B} foo : 4;\n"
|
||||
"};"));
|
||||
}
|
||||
|
||||
|
||||
void simplifyNamespaceStd() {
|
||||
static const char code1[] = "map<foo, bar> m;"; // namespace std is not used
|
||||
|
|
Loading…
Reference in New Issue