fix #2651 (Segmentation fault (typedef))
This commit is contained in:
parent
f191b854c2
commit
7b63da4964
|
@ -1235,15 +1235,24 @@ void Tokenizer::simplifyTypedef()
|
||||||
|
|
||||||
// function: typedef ... ( .... type )( ... );
|
// function: typedef ... ( .... type )( ... );
|
||||||
// typedef ... (( .... type )( ... ));
|
// typedef ... (( .... type )( ... ));
|
||||||
|
// typedef ... ( * ( .... type )( ... ));
|
||||||
else if ((tok->tokAt(offset)->str() == "(" &&
|
else if ((tok->tokAt(offset)->str() == "(" &&
|
||||||
Token::Match(tok->tokAt(offset)->link()->previous(), "%type% ) (") &&
|
Token::Match(tok->tokAt(offset)->link()->previous(), "%type% ) (") &&
|
||||||
Token::Match(tok->tokAt(offset)->link()->next()->link(), ") const|volatile|;")) ||
|
Token::Match(tok->tokAt(offset)->link()->next()->link(), ") const|volatile|;")) ||
|
||||||
(Token::simpleMatch(tok->tokAt(offset), "( (") &&
|
(Token::simpleMatch(tok->tokAt(offset), "( (") &&
|
||||||
Token::Match(tok->tokAt(offset + 1)->link()->previous(), "%type% ) (") &&
|
Token::Match(tok->tokAt(offset + 1)->link()->previous(), "%type% ) (") &&
|
||||||
Token::Match(tok->tokAt(offset + 1)->link()->next()->link(), ") const|volatile| )")))
|
Token::Match(tok->tokAt(offset + 1)->link()->next()->link(), ") const|volatile| ) ;|,")) ||
|
||||||
|
(Token::simpleMatch(tok->tokAt(offset), "( * (") &&
|
||||||
|
Token::Match(tok->tokAt(offset + 2)->link()->previous(), "%type% ) (") &&
|
||||||
|
Token::Match(tok->tokAt(offset + 2)->link()->next()->link(), ") const|volatile| ) ;|,")))
|
||||||
{
|
{
|
||||||
if (tok->strAt(offset + 1) == "(")
|
if (tok->strAt(offset + 1) == "(")
|
||||||
offset++;
|
offset++;
|
||||||
|
else if (Token::simpleMatch(tok->tokAt(offset), "( * ("))
|
||||||
|
{
|
||||||
|
pointers.push_back("*");
|
||||||
|
offset += 2;
|
||||||
|
}
|
||||||
|
|
||||||
if (tok->tokAt(offset)->link()->strAt(-2) == "*")
|
if (tok->tokAt(offset)->link()->strAt(-2) == "*")
|
||||||
functionPtr = true;
|
functionPtr = true;
|
||||||
|
@ -1289,7 +1298,9 @@ void Tokenizer::simplifyTypedef()
|
||||||
}
|
}
|
||||||
|
|
||||||
// pointer to function returning pointer to function
|
// pointer to function returning pointer to function
|
||||||
else if (Token::Match(tok->tokAt(offset), "( * ( * %type% ) ("))
|
else if (Token::Match(tok->tokAt(offset), "( * ( * %type% ) (") &&
|
||||||
|
Token::Match(tok->tokAt(offset + 6)->link(), ") ) (") &&
|
||||||
|
Token::Match(tok->tokAt(offset + 6)->link()->tokAt(2)->link(), ") ;|,"))
|
||||||
{
|
{
|
||||||
functionPtrRetFuncPtr = true;
|
functionPtrRetFuncPtr = true;
|
||||||
|
|
||||||
|
@ -1305,7 +1316,8 @@ void Tokenizer::simplifyTypedef()
|
||||||
|
|
||||||
// function returning pointer to function
|
// function returning pointer to function
|
||||||
else if (Token::Match(tok->tokAt(offset), "( * %type% (") &&
|
else if (Token::Match(tok->tokAt(offset), "( * %type% (") &&
|
||||||
Token::simpleMatch(tok->tokAt(offset + 3)->link(), ") ) ("))
|
Token::simpleMatch(tok->tokAt(offset + 3)->link(), ") ) (") &&
|
||||||
|
Token::Match(tok->tokAt(offset + 3)->link()->tokAt(2)->link(), ") ;|,"))
|
||||||
{
|
{
|
||||||
functionRetFuncPtr = true;
|
functionRetFuncPtr = true;
|
||||||
|
|
||||||
|
|
|
@ -250,6 +250,7 @@ private:
|
||||||
TEST_CASE(simplifyTypedef84); // ticket #2630
|
TEST_CASE(simplifyTypedef84); // ticket #2630
|
||||||
TEST_CASE(simplifyTypedef85); // ticket #2651
|
TEST_CASE(simplifyTypedef85); // ticket #2651
|
||||||
TEST_CASE(simplifyTypedef86); // ticket #2581
|
TEST_CASE(simplifyTypedef86); // ticket #2581
|
||||||
|
TEST_CASE(simplifyTypedef87); // ticket #2651
|
||||||
|
|
||||||
TEST_CASE(simplifyTypedefFunction1);
|
TEST_CASE(simplifyTypedefFunction1);
|
||||||
TEST_CASE(simplifyTypedefFunction2); // ticket #1685
|
TEST_CASE(simplifyTypedefFunction2); // ticket #1685
|
||||||
|
@ -5060,6 +5061,15 @@ private:
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void simplifyTypedef87() // ticket #2651
|
||||||
|
{
|
||||||
|
const char code[] = "typedef FOO (*(*BAR)(void, int, const int, int*));\n";
|
||||||
|
const char expected[] = ";";
|
||||||
|
checkSimplifyTypedef(code);
|
||||||
|
ASSERT_EQUALS(expected, sizeof_(code));
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
void simplifyTypedefFunction1()
|
void simplifyTypedefFunction1()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue