typedefs: handle __typeof__

This commit is contained in:
Robert Reif 2010-11-11 06:40:49 +01:00 committed by Daniel Marjamäki
parent 624ce205b9
commit a09c221014
2 changed files with 53 additions and 0 deletions

View File

@ -818,6 +818,7 @@ void Tokenizer::simplifyTypedef()
bool ptrToArray = false; bool ptrToArray = false;
bool refToArray = false; bool refToArray = false;
bool ptrMember = false; bool ptrMember = false;
bool typeOf = false;
Token *namespaceStart = 0; Token *namespaceStart = 0;
Token *namespaceEnd = 0; Token *namespaceEnd = 0;
@ -959,6 +960,18 @@ void Tokenizer::simplifyTypedef()
continue; continue;
} }
} }
// typeof
else if (Token::simpleMatch(tok->tokAt(offset - 1), "__typeof__ (") &&
Token::Match(tok->tokAt(offset)->link(), ") %type% ;"))
{
argStart = tok->tokAt(offset);
argEnd = tok->tokAt(offset)->link();
typeName = tok->tokAt(offset)->link()->next();
tok = typeName->next();
typeOf = true;
}
else if (Token::Match(tok->tokAt(offset), "( *|&| const|volatile| const|volatile| %type% ) (")) else if (Token::Match(tok->tokAt(offset), "( *|&| const|volatile| const|volatile| %type% ) ("))
{ {
functionPtr = tok->tokAt(offset + 1)->str() == "*"; functionPtr = tok->tokAt(offset + 1)->str() == "*";
@ -1592,6 +1605,36 @@ void Tokenizer::simplifyTypedef()
tok2 = tok2->next(); tok2 = tok2->next();
Token::createMutualLinks(tok2, tok3); Token::createMutualLinks(tok2, tok3);
} }
else if (typeOf)
{
tok2->insertToken("(");
tok2 = tok2->next();
Token *tok3 = tok2;
Token *nextArgTok;
std::stack<Token *> argLinks;
for (nextArgTok = argStart->next(); nextArgTok != argEnd; nextArgTok = nextArgTok->next())
{
tok2->insertToken(nextArgTok->strAt(0));
tok2 = tok2->next();
// Check for links and fix them up
if (tok2->str() == "(" || tok2->str() == "[")
argLinks.push(tok2);
if (tok2->str() == ")" || tok2->str() == "]")
{
Token * link = argLinks.top();
tok2->link(link);
link->link(tok2);
argLinks.pop();
}
}
tok2->insertToken(")");
tok2 = tok2->next();
Token::createMutualLinks(tok2, tok3);
}
else if (tok2->tokAt(2) && tok2->tokAt(2)->str() == "[") else if (tok2->tokAt(2) && tok2->tokAt(2)->str() == "[")
{ {
while (tok2->tokAt(2) && tok2->tokAt(2)->str() == "[") while (tok2->tokAt(2) && tok2->tokAt(2)->str() == "[")

View File

@ -219,6 +219,7 @@ private:
TEST_CASE(simplifyTypedef61); // ticket #2074 and 2075 TEST_CASE(simplifyTypedef61); // ticket #2074 and 2075
TEST_CASE(simplifyTypedef62); // ticket #2082 TEST_CASE(simplifyTypedef62); // ticket #2082
TEST_CASE(simplifyTypedef63); // ticket #2175 'typedef float x[3];' TEST_CASE(simplifyTypedef63); // ticket #2175 'typedef float x[3];'
TEST_CASE(simplifyTypedef64);
TEST_CASE(simplifyTypedefFunction1); TEST_CASE(simplifyTypedefFunction1);
TEST_CASE(simplifyTypedefFunction2); // ticket #1685 TEST_CASE(simplifyTypedefFunction2); // ticket #1685
@ -4528,6 +4529,15 @@ private:
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
} }
void simplifyTypedef64()
{
const char code[] = "typedef __typeof__(__type1() + __type2()) __type;"
"__type t;\n";
const std::string actual(sizeof_(code));
ASSERT_EQUALS("; __typeof__ ( __type1 ( ) + __type2 ( ) ) t ;", actual);
ASSERT_EQUALS("", errout.str());
}
void simplifyTypedefFunction1() void simplifyTypedefFunction1()
{ {
{ {