From ade89f1192f97fa575f892f4cc7d899de1bc46d1 Mon Sep 17 00:00:00 2001 From: swasti16 Date: Tue, 9 Dec 2025 07:56:43 +0530 Subject: [PATCH] Fix #14319: originalName missing from the dumpfile --- lib/tokenize.cpp | 34 +++++++++++++++++++++------------- test/testsimplifytypedef.cpp | 29 +++++++++++++++++++++++++---- 2 files changed, 46 insertions(+), 17 deletions(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index da279b8f453..c1dd0a372f9 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -669,7 +669,7 @@ namespace { return mNameToken ? mNameToken->str() : ""; } - void replace(Token* tok) { + void replace(Token* tok, const std::string &originalname) { if (tok == mNameToken) return; @@ -701,7 +701,7 @@ namespace { insertTokens(tok2, mRangeTypeQualifiers); } else { // functional-style cast - tok->originalName(tok->str()); + tok->originalName(originalname); tok->isSimplifiedTypedef(true); tok->str("("); Token* tok2 = insertTokens(tok, mRangeType); @@ -721,14 +721,14 @@ namespace { if (isFunctionPointer && isCast(tok->previous())) { tok->insertToken("*"); Token* const tok_1 = insertTokens(tok, std::pair(mRangeType.first, mNameToken->linkAt(1))); - tok_1->originalName(tok->str()); + tok_1->originalName(originalname); tok->deleteThis(); return; } // Inherited type => skip "struct" / "class" if (Token::Match(mRangeType.first, "const| struct|class %name% {") && Token::Match(tok->previous(), "public|protected|private|<")) { - tok->originalName(tok->str()); + tok->originalName(originalname); tok->str(mRangeType.second->strAt(-1)); return; } @@ -736,7 +736,7 @@ namespace { if (Token::Match(tok, "%name% ::")) { if (Token::Match(mRangeType.first, "const| struct|class|union|enum %name% %name%|{") || Token::Match(mRangeType.first, "%name% %name% ;")) { - tok->originalName(tok->str()); + tok->originalName(originalname); tok->str(mRangeType.second->strAt(-1)); } else { mReplaceFailed = true; @@ -790,8 +790,8 @@ namespace { Token* const tok2 = insertTokens(tok, rangeType); Token* const tok3 = insertTokens(tok2, mRangeTypeQualifiers); - tok2->originalName(tok->str()); - tok3->originalName(tok->str()); + tok2->originalName(originalname); + tok3->originalName(originalname); Token *after = tok3; while (Token::Match(after, "%name%|*|&|&&|::")) after = after->next(); @@ -1023,12 +1023,18 @@ void Tokenizer::simplifyTypedef() { // Simplify global typedefs that are not redefined with the fast 1-pass simplification. // Then use the slower old typedef simplification. - std::map numberOfTypedefs; + std::map> numberOfTypedefs; for (Token* tok = list.front(); tok; tok = tok->next()) { if (tok->str() == "typedef") { TypedefSimplifier ts(tok); - if (!ts.fail()) - numberOfTypedefs[ts.name()]++; + if (ts.fail() || !ts.nameToken()) + continue; + std::string existing_data_type; + for (const Token* t = ts.getTypedefToken()->next(); t != ts.endToken(); t = t->next()) { + if (t != ts.nameToken()) + existing_data_type += t->str() + " "; + } + numberOfTypedefs[ts.name()].insert(existing_data_type); continue; } } @@ -1046,8 +1052,7 @@ void Tokenizer::simplifyTypedef() if (indentlevel == 0 && tok->str() == "typedef") { TypedefSimplifier ts(tok); - if (!ts.fail() && numberOfTypedefs[ts.name()] == 1 && - (numberOfTypedefs.find(ts.getTypedefToken()->strAt(1)) == numberOfTypedefs.end() || ts.getTypedefToken()->strAt(2) == "(")) { + if (!ts.fail() && numberOfTypedefs[ts.name()].size() == 1) { if (mSettings.severity.isEnabled(Severity::portability) && ts.isInvalidConstFunctionType(typedefs)) invalidConstFunctionTypeError(tok->next()); typedefs.emplace(ts.name(), ts); @@ -1060,8 +1065,11 @@ void Tokenizer::simplifyTypedef() auto it = typedefs.find(tok->str()); if (it != typedefs.end() && it->second.canReplace(tok)) { std::set r; + std::string originalname; while (it != typedefs.end() && r.insert(tok->str()).second) { - it->second.replace(tok); + if (originalname.empty()) + originalname = tok->str(); + it->second.replace(tok, originalname); it = typedefs.find(tok->str()); } } else if (tok->str() == "enum") { diff --git a/test/testsimplifytypedef.cpp b/test/testsimplifytypedef.cpp index 368a143a9ad..ed7fbe93a38 100644 --- a/test/testsimplifytypedef.cpp +++ b/test/testsimplifytypedef.cpp @@ -246,7 +246,8 @@ class TestSimplifyTypedef : public TestFixture { TEST_CASE(simplifyTypedefMacro); - TEST_CASE(simplifyTypedefOriginalName); + TEST_CASE(simplifyTypedefOriginalName1); + TEST_CASE(simplifyTypedefOriginalName2); TEST_CASE(simplifyTypedefTokenColumn1); TEST_CASE(simplifyTypedefTokenColumn2); @@ -1284,7 +1285,7 @@ class TestSimplifyTypedef : public TestFixture { "LPCSTR ccp;"; const char expected[] = - "; char c ; " + "char c ; " "char * cp ; " "const char * ccp ;"; @@ -3679,7 +3680,7 @@ class TestSimplifyTypedef : public TestFixture { "Y y;\n" "Yp yp;\n" "Ya ya;\n"; - exp = "long y ; long * yp ; long ya [ 3 ] ;"; + exp = "; long y ; long * yp ; long ya [ 3 ] ;"; ASSERT_EQUALS(exp, tok(code)); } @@ -4444,7 +4445,7 @@ class TestSimplifyTypedef : public TestFixture { simplifyTypedefP(code)); } - void simplifyTypedefOriginalName() { + void simplifyTypedefOriginalName1() { const char code[] = "typedef unsigned char uint8_t;" "typedef float (*rFunctionPointer_fp)(uint8_t, uint8_t);" "typedef enum eEnumDef {" @@ -4500,6 +4501,26 @@ class TestSimplifyTypedef : public TestFixture { ASSERT_EQUALS("rFunctionPointer_fp", token->originalName()); } + void simplifyTypedefOriginalName2() { + const char code[] = "typedef unsigned short uint16;\n" + "typedef uint16 A;\n" + "A a;"; + TokenList tokenlist{ settings1, Standards::Language::C }; + ASSERT(TokenListHelper::createTokensFromString(tokenlist, code, "file.c")); + TokenizerTest tokenizer(std::move(tokenlist), *this); + tokenizer.createLinks(); + tokenizer.simplifyTypedef(); + + try { + tokenizer.validate(); + } + catch (const InternalError&) { + ASSERT_EQUALS_MSG(false, true, "Validation of Tokenizer failed"); + } + const Token* token = Token::findsimplematch(tokenizer.list.front(), "short"); + ASSERT_EQUALS("A", token->originalName()); + } + void simplifyTypedefTokenColumn1() { // #13155 const char code[] = "void foo(void) {\n" " typedef signed int MY_INT;\n"