fix an error in Tokenizer::simplifyTypedef() (#2880)

This commit is contained in:
uhziel 2020-11-04 20:32:31 +08:00 committed by GitHub
parent a7f6621fc0
commit aad29ddb9a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 15 additions and 4 deletions

View File

@ -410,9 +410,10 @@ Token * Tokenizer::deleteInvalidTypedef(Token *typeDef)
namespace {
struct Space {
Space() : bodyEnd(nullptr), isNamespace(false) { }
Space() : bodyEnd(nullptr), bodyEnd2(nullptr), isNamespace(false) { }
std::string className;
const Token * bodyEnd;
const Token * bodyEnd; // for body contains typedef define
const Token * bodyEnd2; // for body contains typedef using
bool isNamespace;
};
}
@ -609,6 +610,7 @@ void Tokenizer::simplifyTypedef()
info.isNamespace = isNamespace;
info.className = className;
info.bodyEnd = tok->link();
info.bodyEnd2 = tok->link();
spaceInfo.push_back(info);
hasClass = false;
@ -1050,7 +1052,7 @@ void Tokenizer::simplifyTypedef()
inMemberFunc = false;
}
if (classLevel > 0 && tok2 == spaceInfo[classLevel - 1].bodyEnd) {
if (classLevel > 0 && tok2 == spaceInfo[classLevel - 1].bodyEnd2) {
--classLevel;
pattern.clear();
@ -1103,7 +1105,7 @@ void Tokenizer::simplifyTypedef()
if (classLevel < spaceInfo.size() &&
spaceInfo[classLevel].isNamespace &&
spaceInfo[classLevel].className == tok2->previous()->str()) {
spaceInfo[classLevel].bodyEnd = tok2->link();
spaceInfo[classLevel].bodyEnd2 = tok2->link();
++classLevel;
pattern.clear();
for (int i = classLevel; i < spaceInfo.size(); ++i)

View File

@ -169,6 +169,7 @@ private:
TEST_CASE(simplifyTypedef131); // ticket #9446
TEST_CASE(simplifyTypedef132); // ticket #9739 - using
TEST_CASE(simplifyTypedef133); // ticket #9812 - using
TEST_CASE(simplifyTypedef134);
TEST_CASE(simplifyTypedefFunction1);
TEST_CASE(simplifyTypedefFunction2); // ticket #1685
@ -2660,6 +2661,14 @@ private:
ASSERT_EQUALS("using array_p = const unsigned char ( * ) [ 16 ] ; array_p x ;", tok(code, false));
}
void simplifyTypedef134() {
const char code[] = "namespace foo { typedef long long int64; }\n"
"typedef int int32;\n"
"namespace foo { int64 i; }\n"
"int32 j;";
ASSERT_EQUALS("namespace foo { long long i ; } int j ;", tok(code, false));
}
void simplifyTypedefFunction1() {
{
const char code[] = "typedef void (*my_func)();\n"