Fixed #1829 (### Internal error in Cppcheck. Please report it.)
This commit is contained in:
parent
dc2a0a6468
commit
b0f1d5669b
|
@ -1188,12 +1188,13 @@ void Tokenizer::simplifyTypedef()
|
|||
// 1. variable declarations that preserve the variable name like
|
||||
// global, local, and function parameters
|
||||
// 2. not variable declarations that have no name like derived
|
||||
// classes, casts, and template parameters
|
||||
// classes, casts, operators, and template parameters
|
||||
|
||||
// try to determine which catagory this substitution is
|
||||
bool isDerived = false;
|
||||
bool inCast = false;
|
||||
bool inTemplate = false;
|
||||
bool inOperator = false;
|
||||
|
||||
// check for derived class: class A : some_typedef {
|
||||
isDerived = Token::Match(tok2->previous(), "public|protected|private %type% {|,");
|
||||
|
@ -1209,6 +1210,11 @@ void Tokenizer::simplifyTypedef()
|
|||
Token::Match(tok2->next(), "&|*| &|*| >|,"))
|
||||
inTemplate = true;
|
||||
|
||||
// check for operator
|
||||
if (Token::Match(tok2->previous(), "operator") ||
|
||||
Token::Match(tok2->tokAt(-2), "operator const"))
|
||||
inOperator = true;
|
||||
|
||||
// skip over class or struct in derived class declaration
|
||||
if (isDerived && Token::Match(typeStart, "class|struct"))
|
||||
typeStart = typeStart->next();
|
||||
|
@ -1305,7 +1311,7 @@ void Tokenizer::simplifyTypedef()
|
|||
{
|
||||
if (tok2->next()->str() == "(")
|
||||
tok2 = tok2->next()->link();
|
||||
else if (!Token::Match(tok2->next(), "[|>|;"))
|
||||
else if (!inOperator && !Token::Match(tok2->next(), "[|>|;"))
|
||||
{
|
||||
tok2 = tok2->next();
|
||||
while (Token::Match(tok2, "*|&") &&
|
||||
|
@ -7444,7 +7450,8 @@ void Tokenizer::simplifyConst()
|
|||
for (Token *tok = _tokens; tok; tok = tok->next())
|
||||
{
|
||||
if (Token::Match(tok, "[;{}(,] %type% const") &&
|
||||
tok->next()->str().find(":") == std::string::npos)
|
||||
tok->next()->str().find(":") == std::string::npos &&
|
||||
tok->next()->str() != "operator")
|
||||
{
|
||||
tok->tokAt(2)->str(tok->tokAt(1)->str());
|
||||
tok->tokAt(1)->str("const");
|
||||
|
|
|
@ -206,6 +206,7 @@ private:
|
|||
TEST_CASE(simplifyTypedef53); // ticket #1801
|
||||
TEST_CASE(simplifyTypedef54); // ticket #1814
|
||||
TEST_CASE(simplifyTypedef55);
|
||||
TEST_CASE(simplifyTypedef56); // ticket #1829
|
||||
|
||||
TEST_CASE(simplifyTypedefFunction1);
|
||||
TEST_CASE(simplifyTypedefFunction2); // ticket #1685
|
||||
|
@ -4246,6 +4247,27 @@ private:
|
|||
ASSERT_EQUALS("", errout.str());
|
||||
}
|
||||
|
||||
void simplifyTypedef56() // ticket #1829
|
||||
{
|
||||
const char code[] = "struct C {\n"
|
||||
" typedef void (*fptr)();\n"
|
||||
" const fptr pr;\n"
|
||||
" operator const fptr& () { return pr; }\n"
|
||||
"};\n";
|
||||
|
||||
// The expected result..
|
||||
const std::string expected("struct C { "
|
||||
"; "
|
||||
"const void * pr ; " // this gets simplified to a regular pointer
|
||||
"operator const void ( * ) ( ) & ( ) { return pr ; } "
|
||||
"} ;");
|
||||
ASSERT_EQUALS(expected, sizeof_(code));
|
||||
|
||||
// Check for output..
|
||||
checkSimplifyTypedef(code);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
}
|
||||
|
||||
void simplifyTypedefFunction1()
|
||||
{
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue