#6690 override and final qualifiers plus less than operator results in a syntax error
Tokenizer::simplifyKeyword() is now able to handle all combinations out of const|final|override
This commit is contained in:
parent
3c97736d44
commit
20842fb1fc
|
@ -3157,7 +3157,7 @@ bool Tokenizer::simplifySizeof()
|
|||
for (unsigned int i = 0; i < derefs; i++)
|
||||
tok2 = tok2->linkAt(1); // Skip all dimensions that are derefenced before the sizeof call
|
||||
while (Token::Match(tok2, "] [ %num% ]")) {
|
||||
sz = sz * MathLib::toLongNumber(tok2->strAt(2));
|
||||
sz *= static_cast<size_t>(MathLib::toULongNumber(tok2->strAt(2)));
|
||||
tok2 = tok2->linkAt(1);
|
||||
}
|
||||
if (Token::simpleMatch(tok2, "] ["))
|
||||
|
@ -3169,7 +3169,7 @@ bool Tokenizer::simplifySizeof()
|
|||
continue;
|
||||
const Token *tok2 = nametok->next();
|
||||
while (Token::Match(tok2, "[ %num% ]")) {
|
||||
sz *= static_cast<unsigned long>(MathLib::toLongNumber(tok2->strAt(1)));
|
||||
sz *= static_cast<size_t>(MathLib::toLongNumber(tok2->strAt(1)));
|
||||
tok2 = tok2->link()->next();
|
||||
}
|
||||
if (!tok2 || tok2->str() != ")")
|
||||
|
@ -9315,17 +9315,26 @@ void Tokenizer::simplifyKeyword()
|
|||
}
|
||||
|
||||
// final:
|
||||
// void f() final; <- function is final
|
||||
// struct name final { }; <- struct is final
|
||||
if (Token::Match(tok, ") final [{;]") || Token::Match(tok, "%type% final [:{]"))
|
||||
// 1) struct name final { }; <- struct is final
|
||||
if (Token::Match(tok, "%type% final [:{]")) {
|
||||
tok->deleteNext();
|
||||
|
||||
// override
|
||||
continue;
|
||||
}
|
||||
// final:
|
||||
// 2) void f() final; <- function is final
|
||||
// override:
|
||||
// void f() override;
|
||||
else if (Token::Match(tok, ") override [{;]"))
|
||||
tok->deleteNext();
|
||||
else if (Token::Match(tok, ") const override [{;]"))
|
||||
tok->next()->deleteNext();
|
||||
//if (Token::Match(tok, ") override [{;]"))
|
||||
if (Token::Match(tok, ") const|override|final")) {
|
||||
Token* specifier = tok->tokAt(2);
|
||||
while(specifier && Token::Match(specifier, "const|override|final"))
|
||||
specifier=specifier->next();
|
||||
if (specifier && Token::Match(specifier, "[{;]")) {
|
||||
specifier=tok->next();
|
||||
while (specifier->str()=="override" || specifier->str()=="final")
|
||||
specifier->deleteThis();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4443,18 +4443,49 @@ private:
|
|||
|
||||
void removeKeywords() {
|
||||
const char code[] = "if (__builtin_expect(!!(x), 1));";
|
||||
|
||||
const std::string actual(tokenizeAndStringify(code, true));
|
||||
|
||||
ASSERT_EQUALS("if ( ! ! x ) { ; }", actual);
|
||||
ASSERT_EQUALS("if ( ! ! x ) { ; }", tokenizeAndStringify(code, true));
|
||||
}
|
||||
|
||||
void simplifyKeyword() {
|
||||
const char code[] = "void f (int a [ static 5] );";
|
||||
{
|
||||
const char code[] = "void f (int a [ static 5] );";
|
||||
ASSERT_EQUALS("void f ( int a [ 5 ] ) ;", tokenizeAndStringify(code));
|
||||
}
|
||||
{
|
||||
const char in1[] = "class Base {\n"
|
||||
" virtual int test() = 0;\n"
|
||||
"};\n"
|
||||
"class Derived : public Base {\n"
|
||||
" virtual int test() override final {\n"
|
||||
" for( int Index ( 0 ); Index < 16; ++ Index) { int stub = 0; }\n"
|
||||
" }\n"
|
||||
"};";
|
||||
const char out1[] = "class Base {\n"
|
||||
"virtual int test ( ) = 0 ;\n"
|
||||
"} ;\n"
|
||||
"class Derived : public Base {\n"
|
||||
"virtual int test ( ) {\n"
|
||||
"for ( int Index ( 0 ) ; Index < 16 ; ++ Index ) { int stub ; stub = 0 ; }\n"
|
||||
"}\n"
|
||||
"} ;";
|
||||
ASSERT_EQUALS(out1, tokenizeAndStringify(in1));
|
||||
const char in2[] = "class Derived{\n"
|
||||
" virtual int test() final override;"
|
||||
"};";
|
||||
const char out2[] = "class Derived {\n"
|
||||
"virtual int test ( ) ; } ;";
|
||||
ASSERT_EQUALS(out2, tokenizeAndStringify(in2));
|
||||
const char in3[] = "class Derived{\n"
|
||||
" virtual int test() final override const;"
|
||||
"};";
|
||||
const char out3[] = "class Derived {\n"
|
||||
"virtual int test ( ) const ; } ;";
|
||||
ASSERT_EQUALS(out3, tokenizeAndStringify(in3));
|
||||
|
||||
const std::string actual(tokenizeAndStringify(code, true));
|
||||
|
||||
ASSERT_EQUALS("void f ( int a [ 5 ] ) ;", actual);
|
||||
const char in4 [] = "struct B final : A { void foo(); };";
|
||||
const char out4 [] = "struct B : A { void foo ( ) ; } ;";
|
||||
ASSERT_EQUALS(out4, tokenizeAndStringify(in4));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue