remove cleanupAfterSimplify from the template simplifier (#2998)
The template simplifier works well enough now so cleanupAfterSimplify is no longer necessary. In fact cleanupAfterSimplify was introducing a bug which improperly simplified C++ style casts. Bugs should be exposed and fixed properly rather than just hiding them. Co-authored-by: Robert Reif <reif@FX6840>
This commit is contained in:
parent
d99f17b6aa
commit
e7bdf5f71c
|
@ -296,7 +296,7 @@ void CheckSizeof::sizeofCalculation()
|
||||||
if (tok->isExpandedMacro() && tok->previous()) {
|
if (tok->isExpandedMacro() && tok->previous()) {
|
||||||
const Token *cast_end = (tok->previous()->str() == "(") ? tok->previous() : tok;
|
const Token *cast_end = (tok->previous()->str() == "(") ? tok->previous() : tok;
|
||||||
if (Token::simpleMatch(cast_end->tokAt(-3), "( void )") ||
|
if (Token::simpleMatch(cast_end->tokAt(-3), "( void )") ||
|
||||||
Token::simpleMatch(cast_end->previous(), "static_cast<void>")) {
|
Token::simpleMatch(cast_end->tokAt(-4), "static_cast < void >")) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -337,7 +337,7 @@ void CheckSizeof::sizeofFunction()
|
||||||
if (tok->isExpandedMacro() && tok->previous()) {
|
if (tok->isExpandedMacro() && tok->previous()) {
|
||||||
const Token *cast_end = (tok->previous()->str() == "(") ? tok->previous() : tok;
|
const Token *cast_end = (tok->previous()->str() == "(") ? tok->previous() : tok;
|
||||||
if (Token::simpleMatch(cast_end->tokAt(-3), "( void )") ||
|
if (Token::simpleMatch(cast_end->tokAt(-3), "( void )") ||
|
||||||
Token::simpleMatch(cast_end->previous(), "static_cast<void>")) {
|
Token::simpleMatch(cast_end->tokAt(-4), "static_cast < void >")) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -245,58 +245,6 @@ TemplateSimplifier::~TemplateSimplifier()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void TemplateSimplifier::cleanupAfterSimplify()
|
|
||||||
{
|
|
||||||
bool goback = false;
|
|
||||||
for (Token *tok = mTokenList.front(); tok; tok = tok->next()) {
|
|
||||||
if (goback) {
|
|
||||||
tok = tok->previous();
|
|
||||||
goback = false;
|
|
||||||
}
|
|
||||||
if (tok->str() == "(")
|
|
||||||
tok = tok->link();
|
|
||||||
|
|
||||||
else if (Token::Match(tok, "template < > %name%")) {
|
|
||||||
const Token *end = tok;
|
|
||||||
while (end) {
|
|
||||||
if (end->str() == ";")
|
|
||||||
break;
|
|
||||||
if (end->str() == "{") {
|
|
||||||
end = end->link()->next();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!Token::Match(end, "%name%|::|<|>|,")) {
|
|
||||||
end = nullptr;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
end = end->next();
|
|
||||||
}
|
|
||||||
if (end) {
|
|
||||||
Token::eraseTokens(tok,end);
|
|
||||||
tok->deleteThis();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (Token::Match(tok, "%type% <") &&
|
|
||||||
(!tok->previous() || tok->previous()->str() == ";")) {
|
|
||||||
const Token *tok2 = tok->tokAt(2);
|
|
||||||
std::string type;
|
|
||||||
while (Token::Match(tok2, "%type%|%num% ,")) {
|
|
||||||
type += tok2->str() + ",";
|
|
||||||
tok2 = tok2->tokAt(2);
|
|
||||||
}
|
|
||||||
if (Token::Match(tok2, "%type%|%num% > (")) {
|
|
||||||
type += tok2->str();
|
|
||||||
tok->str(tok->str() + "<" + type + ">");
|
|
||||||
Token::eraseTokens(tok, tok2->tokAt(2));
|
|
||||||
if (tok == mTokenList.front())
|
|
||||||
goback = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void TemplateSimplifier::checkComplicatedSyntaxErrorsInTemplates()
|
void TemplateSimplifier::checkComplicatedSyntaxErrorsInTemplates()
|
||||||
{
|
{
|
||||||
// check for more complicated syntax errors when using templates..
|
// check for more complicated syntax errors when using templates..
|
||||||
|
|
|
@ -47,13 +47,6 @@ public:
|
||||||
explicit TemplateSimplifier(Tokenizer *tokenizer);
|
explicit TemplateSimplifier(Tokenizer *tokenizer);
|
||||||
~TemplateSimplifier();
|
~TemplateSimplifier();
|
||||||
|
|
||||||
/**
|
|
||||||
* Used after simplifyTemplates to perform a little cleanup.
|
|
||||||
* Sometimes the simplifyTemplates isn't fully successful and then
|
|
||||||
* there are function calls etc with "wrong" syntax.
|
|
||||||
*/
|
|
||||||
void cleanupAfterSimplify();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
void checkComplicatedSyntaxErrorsInTemplates();
|
void checkComplicatedSyntaxErrorsInTemplates();
|
||||||
|
|
|
@ -4747,11 +4747,7 @@ bool Tokenizer::simplifyTokenList1(const char FileName[])
|
||||||
if (Settings::terminated())
|
if (Settings::terminated())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// sometimes the "simplifyTemplates" fail and then unsimplified
|
|
||||||
// function calls etc remain. These have the "wrong" syntax. So
|
|
||||||
// this function will just fix so that the syntax is corrected.
|
|
||||||
validate(); // #6847 - invalid code
|
validate(); // #6847 - invalid code
|
||||||
mTemplateSimplifier->cleanupAfterSimplify();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Simplify pointer to standard types (C only)
|
// Simplify pointer to standard types (C only)
|
||||||
|
|
|
@ -997,8 +997,8 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
void template_unhandled() {
|
void template_unhandled() {
|
||||||
// An unhandled template usage should be simplified..
|
// An unhandled template usage should not be simplified..
|
||||||
ASSERT_EQUALS("x<int> ( ) ;", tok("x<int>();"));
|
ASSERT_EQUALS("x < int > ( ) ;", tok("x<int>();"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void template38() { // #4832 - Crash on C++11 right angle brackets
|
void template38() { // #4832 - Crash on C++11 right angle brackets
|
||||||
|
|
|
@ -4315,13 +4315,13 @@ private:
|
||||||
void unsigned3() {
|
void unsigned3() {
|
||||||
{
|
{
|
||||||
const char code[] = "; foo<unsigned>();";
|
const char code[] = "; foo<unsigned>();";
|
||||||
const char expected[] = "; foo<int> ( ) ;";
|
const char expected[] = "; foo < unsigned int > ( ) ;";
|
||||||
ASSERT_EQUALS(expected, tokenizeAndStringify(code));
|
ASSERT_EQUALS(expected, tokenizeAndStringify(code));
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
const char code[] = "; foo<unsigned int>();";
|
const char code[] = "; foo<unsigned int>();";
|
||||||
const char expected[] = "; foo<int> ( ) ;";
|
const char expected[] = "; foo < unsigned int > ( ) ;";
|
||||||
ASSERT_EQUALS(expected, tokenizeAndStringify(code));
|
ASSERT_EQUALS(expected, tokenizeAndStringify(code));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue