Tokenizer::simplifyBitfields: fixed more issues. Ticket #1956
This commit is contained in:
parent
3fcca23b53
commit
cb7b508f77
|
@ -562,7 +562,7 @@ size_t Token::getStrLength(const Token *tok)
|
||||||
bool Token::isStandardType() const
|
bool Token::isStandardType() const
|
||||||
{
|
{
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
const char *type[] = {"bool", "char", "short", "int", "long", "float", "double", "size_t", "__int64", 0};
|
const char *type[] = {"bool", "char", "short", "int", "long", "float", "double", "size_t", "__int8", "__int16", "__int32", "__int64", 0};
|
||||||
for (int i = 0; type[i]; i++)
|
for (int i = 0; type[i]; i++)
|
||||||
ret |= (_str == type[i]);
|
ret |= (_str == type[i]);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -571,7 +571,7 @@ bool Token::isStandardType() const
|
||||||
bool Token::isIntegerType() const
|
bool Token::isIntegerType() const
|
||||||
{
|
{
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
const char *type[] = {"char", "short", "int", "long", "size_t", "__int64", 0};
|
const char *type[] = {"char", "short", "int", "long", "size_t", "__int8", "__int16", "__int32", "__int64", 0};
|
||||||
for (int i = 0; type[i]; i++)
|
for (int i = 0; type[i]; i++)
|
||||||
ret |= (_str == type[i]);
|
ret |= (_str == type[i]);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -1794,9 +1794,6 @@ bool Tokenizer::tokenize(std::istream &code, const char FileName[], const std::s
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// simplify bit fields..
|
|
||||||
simplifyBitfields();
|
|
||||||
|
|
||||||
// Remove __declspec()
|
// Remove __declspec()
|
||||||
simplifyDeclspec();
|
simplifyDeclspec();
|
||||||
|
|
||||||
|
@ -1831,6 +1828,9 @@ bool Tokenizer::tokenize(std::istream &code, const char FileName[], const std::s
|
||||||
// unsigned long long int => long _isUnsigned=true,_isLong=true
|
// unsigned long long int => long _isUnsigned=true,_isLong=true
|
||||||
simplifyStdType();
|
simplifyStdType();
|
||||||
|
|
||||||
|
// simplify bit fields..
|
||||||
|
simplifyBitfields();
|
||||||
|
|
||||||
// Use "<" comparison instead of ">"
|
// Use "<" comparison instead of ">"
|
||||||
simplifyComparisonOrder();
|
simplifyComparisonOrder();
|
||||||
|
|
||||||
|
@ -4970,14 +4970,14 @@ void Tokenizer::simplifyStdType()
|
||||||
for (Token *tok = _tokens; tok; tok = tok->next())
|
for (Token *tok = _tokens; tok; tok = tok->next())
|
||||||
{
|
{
|
||||||
// long unsigned => unsigned long
|
// long unsigned => unsigned long
|
||||||
if (Token::Match(tok, "long|short|int|char|_int64 unsigned|signed"))
|
if (Token::Match(tok, "char|short|int|long|__int8|__int16|__int32|__int64 unsigned|signed"))
|
||||||
{
|
{
|
||||||
std::string temp = tok->str();
|
std::string temp = tok->str();
|
||||||
tok->str(tok->next()->str());
|
tok->str(tok->next()->str());
|
||||||
tok->next()->str(temp);
|
tok->next()->str(temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Token::Match(tok, "unsigned|signed|long|char|short|int|__int64"))
|
if (!Token::Match(tok, "unsigned|signed|char|short|int|long|__int8|__int16|__int32|__int64"))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// check if signed or unsigned specified
|
// check if signed or unsigned specified
|
||||||
|
@ -4994,7 +4994,13 @@ void Tokenizer::simplifyStdType()
|
||||||
tok->isSigned(!isUnsigned);
|
tok->isSigned(!isUnsigned);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Token::Match(tok, "__int64"))
|
if (Token::Match(tok, "__int8"))
|
||||||
|
tok->str("char");
|
||||||
|
else if (Token::Match(tok, "__int16"))
|
||||||
|
tok->str("short");
|
||||||
|
else if (Token::Match(tok, "__int32"))
|
||||||
|
tok->str("int");
|
||||||
|
else if (Token::Match(tok, "__int64"))
|
||||||
{
|
{
|
||||||
tok->str("long");
|
tok->str("long");
|
||||||
tok->isLong(true);
|
tok->isLong(true);
|
||||||
|
@ -8006,7 +8012,7 @@ static bool isAllUpper(const Token *type)
|
||||||
|
|
||||||
static bool isBitfieldType(const Token *type)
|
static bool isBitfieldType(const Token *type)
|
||||||
{
|
{
|
||||||
if (Token::Match(type, "signed|unsigned|int|long|bool|char|short|__int64") || isAllUpper(type))
|
if (Token::Match(type, "bool|char|short|int|long") || isAllUpper(type))
|
||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -8022,20 +8028,15 @@ void Tokenizer::simplifyBitfields()
|
||||||
last = tok->tokAt(5);
|
last = tok->tokAt(5);
|
||||||
Token::eraseTokens(tok->tokAt(2), tok->tokAt(5));
|
Token::eraseTokens(tok->tokAt(2), tok->tokAt(5));
|
||||||
}
|
}
|
||||||
else if (Token::Match(tok, ";|{|public:|protected:|private: signed|unsigned %type% %var% : %num% ;|,") && isBitfieldType(tok->tokAt(2)))
|
|
||||||
{
|
|
||||||
last = tok->tokAt(6);
|
|
||||||
Token::eraseTokens(tok->tokAt(3), tok->tokAt(6));
|
|
||||||
}
|
|
||||||
else if (Token::Match(tok, ";|{|public:|protected:|private: const %type% %var% : %num% ;|,") && isBitfieldType(tok->tokAt(2)))
|
else if (Token::Match(tok, ";|{|public:|protected:|private: const %type% %var% : %num% ;|,") && isBitfieldType(tok->tokAt(2)))
|
||||||
{
|
{
|
||||||
last = tok->tokAt(6);
|
last = tok->tokAt(6);
|
||||||
Token::eraseTokens(tok->tokAt(3), tok->tokAt(6));
|
Token::eraseTokens(tok->tokAt(3), tok->tokAt(6));
|
||||||
}
|
}
|
||||||
else if (Token::Match(tok, ";|{|public:|protected:|private: const signed|unsigned %type% %var% : %num% ;|,") && isBitfieldType(tok->tokAt(3)))
|
else if (Token::Match(tok, ";|{|public:|protected:|private: %type% : %num% ;") && isBitfieldType(tok->next()))
|
||||||
{
|
{
|
||||||
last = tok->tokAt(7);
|
Token::eraseTokens(tok->tokAt(0), tok->tokAt(5));
|
||||||
Token::eraseTokens(tok->tokAt(4), tok->tokAt(7));
|
tok = tok->previous();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (last && last->str() == ",")
|
if (last && last->str() == ",")
|
||||||
|
@ -8046,14 +8047,9 @@ void Tokenizer::simplifyBitfields()
|
||||||
Token *tok2 = tok->next();
|
Token *tok2 = tok->next();
|
||||||
tok1->insertToken(tok2->str());
|
tok1->insertToken(tok2->str());
|
||||||
tok1 = tok1->next();
|
tok1 = tok1->next();
|
||||||
tok2 = tok2->next();
|
tok1->isSigned(tok2->isSigned());
|
||||||
|
tok1->isUnsigned(tok2->isUnsigned());
|
||||||
while (tok2->str() != last->previous()->str())
|
tok1->isLong(tok2->isLong());
|
||||||
{
|
|
||||||
tok1->insertToken(tok2->str());
|
|
||||||
tok1 = tok1->next();
|
|
||||||
tok2 = tok2->next();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4313,38 +4313,65 @@ private:
|
||||||
const char code5[] = "struct A { long x : 3; };";
|
const char code5[] = "struct A { long x : 3; };";
|
||||||
ASSERT_EQUALS("struct A { long x ; } ;", tokenizeAndStringify(code5,false));
|
ASSERT_EQUALS("struct A { long x ; } ;", tokenizeAndStringify(code5,false));
|
||||||
|
|
||||||
const char code6[] = "struct A { __int64 x : 3; };";
|
const char code6[] = "struct A { __int8 x : 3; };";
|
||||||
ASSERT_EQUALS("struct A { long long x ; } ;", tokenizeAndStringify(code6,false));
|
ASSERT_EQUALS("struct A { char x ; } ;", tokenizeAndStringify(code6,false));
|
||||||
|
|
||||||
const char code7[] = "struct A { unsigned char x : 3; };";
|
const char code7[] = "struct A { __int16 x : 3; };";
|
||||||
ASSERT_EQUALS("struct A { unsigned char x ; } ;", tokenizeAndStringify(code7,false));
|
ASSERT_EQUALS("struct A { short x ; } ;", tokenizeAndStringify(code7,false));
|
||||||
|
|
||||||
const char code8[] = "struct A { unsigned short x : 3; };";
|
const char code8[] = "struct A { __int32 x : 3; };";
|
||||||
ASSERT_EQUALS("struct A { unsigned short x ; } ;", tokenizeAndStringify(code8,false));
|
ASSERT_EQUALS("struct A { int x ; } ;", tokenizeAndStringify(code8,false));
|
||||||
|
|
||||||
const char code9[] = "struct A { unsigned int x : 3; };";
|
const char code9[] = "struct A { __int64 x : 3; };";
|
||||||
ASSERT_EQUALS("struct A { unsigned int x ; } ;", tokenizeAndStringify(code9,false));
|
ASSERT_EQUALS("struct A { long long x ; } ;", tokenizeAndStringify(code9,false));
|
||||||
|
|
||||||
const char code10[] = "struct A { unsigned long x : 3; };";
|
const char code10[] = "struct A { unsigned char x : 3; };";
|
||||||
ASSERT_EQUALS("struct A { unsigned long x ; } ;", tokenizeAndStringify(code10,false));
|
ASSERT_EQUALS("struct A { unsigned char x ; } ;", tokenizeAndStringify(code10,false));
|
||||||
|
|
||||||
const char code11[] = "struct A { unsigned __int64 x : 3; };";
|
const char code11[] = "struct A { unsigned short x : 3; };";
|
||||||
ASSERT_EQUALS("struct A { unsigned long long x ; } ;", tokenizeAndStringify(code11,false));
|
ASSERT_EQUALS("struct A { unsigned short x ; } ;", tokenizeAndStringify(code11,false));
|
||||||
|
|
||||||
const char code12[] = "struct A { signed char x : 3; };";
|
const char code12[] = "struct A { unsigned int x : 3; };";
|
||||||
ASSERT_EQUALS("struct A { signed char x ; } ;", tokenizeAndStringify(code12,false));
|
ASSERT_EQUALS("struct A { unsigned int x ; } ;", tokenizeAndStringify(code12,false));
|
||||||
|
|
||||||
const char code13[] = "struct A { signed short x : 3; };";
|
const char code13[] = "struct A { unsigned long x : 3; };";
|
||||||
ASSERT_EQUALS("struct A { signed short x ; } ;", tokenizeAndStringify(code13,false));
|
ASSERT_EQUALS("struct A { unsigned long x ; } ;", tokenizeAndStringify(code13,false));
|
||||||
|
|
||||||
const char code14[] = "struct A { signed int x : 3; };";
|
const char code14[] = "struct A { unsigned __int8 x : 3; };";
|
||||||
ASSERT_EQUALS("struct A { signed int x ; } ;", tokenizeAndStringify(code14,false));
|
ASSERT_EQUALS("struct A { unsigned char x ; } ;", tokenizeAndStringify(code14,false));
|
||||||
|
|
||||||
const char code15[] = "struct A { signed long x : 3; };";
|
const char code15[] = "struct A { unsigned __int16 x : 3; };";
|
||||||
ASSERT_EQUALS("struct A { signed long x ; } ;", tokenizeAndStringify(code15,false));
|
ASSERT_EQUALS("struct A { unsigned short x ; } ;", tokenizeAndStringify(code15,false));
|
||||||
|
|
||||||
const char code16[] = "struct A { signed __int64 x : 3; };";
|
const char code16[] = "struct A { unsigned __int32 x : 3; };";
|
||||||
ASSERT_EQUALS("struct A { signed long long x ; } ;", tokenizeAndStringify(code16,false));
|
ASSERT_EQUALS("struct A { unsigned int x ; } ;", tokenizeAndStringify(code16,false));
|
||||||
|
|
||||||
|
const char code17[] = "struct A { unsigned __int64 x : 3; };";
|
||||||
|
ASSERT_EQUALS("struct A { unsigned long long x ; } ;", tokenizeAndStringify(code17,false));
|
||||||
|
|
||||||
|
const char code18[] = "struct A { signed char x : 3; };";
|
||||||
|
ASSERT_EQUALS("struct A { signed char x ; } ;", tokenizeAndStringify(code18,false));
|
||||||
|
|
||||||
|
const char code19[] = "struct A { signed short x : 3; };";
|
||||||
|
ASSERT_EQUALS("struct A { signed short x ; } ;", tokenizeAndStringify(code19,false));
|
||||||
|
|
||||||
|
const char code20[] = "struct A { signed int x : 3; };";
|
||||||
|
ASSERT_EQUALS("struct A { signed int x ; } ;", tokenizeAndStringify(code20,false));
|
||||||
|
|
||||||
|
const char code21[] = "struct A { signed long x : 3; };";
|
||||||
|
ASSERT_EQUALS("struct A { signed long x ; } ;", tokenizeAndStringify(code21,false));
|
||||||
|
|
||||||
|
const char code22[] = "struct A { signed __int8 x : 3; };";
|
||||||
|
ASSERT_EQUALS("struct A { signed char x ; } ;", tokenizeAndStringify(code22,false));
|
||||||
|
|
||||||
|
const char code23[] = "struct A { signed __int16 x : 3; };";
|
||||||
|
ASSERT_EQUALS("struct A { signed short x ; } ;", tokenizeAndStringify(code23,false));
|
||||||
|
|
||||||
|
const char code24[] = "struct A { signed __int32 x : 3; };";
|
||||||
|
ASSERT_EQUALS("struct A { signed int x ; } ;", tokenizeAndStringify(code24,false));
|
||||||
|
|
||||||
|
const char code25[] = "struct A { signed __int64 x : 3; };";
|
||||||
|
ASSERT_EQUALS("struct A { signed long long x ; } ;", tokenizeAndStringify(code25,false));
|
||||||
}
|
}
|
||||||
|
|
||||||
void bitfields2()
|
void bitfields2()
|
||||||
|
@ -4420,6 +4447,9 @@ private:
|
||||||
{
|
{
|
||||||
const char code1[] = "struct RGB { unsigned int r : 3, g : 3, b : 2; };";
|
const char code1[] = "struct RGB { unsigned int r : 3, g : 3, b : 2; };";
|
||||||
ASSERT_EQUALS("struct RGB { unsigned int r ; unsigned int g ; unsigned int b ; } ;", tokenizeAndStringify(code1,false));
|
ASSERT_EQUALS("struct RGB { unsigned int r ; unsigned int g ; unsigned int b ; } ;", tokenizeAndStringify(code1,false));
|
||||||
|
|
||||||
|
const char code2[] = "struct A { int a : 3; int : 3; int c : 3; };";
|
||||||
|
ASSERT_EQUALS("struct A { int a ; int c ; } ;", tokenizeAndStringify(code2,false));
|
||||||
}
|
}
|
||||||
|
|
||||||
void microsoftMFC()
|
void microsoftMFC()
|
||||||
|
|
Loading…
Reference in New Issue