From 79c22c6f0edc5470edca945d4d766c6a7a86b957 Mon Sep 17 00:00:00 2001 From: chrchr Date: Mon, 4 Mar 2024 16:15:36 +0100 Subject: [PATCH] Don't simplify within class definition --- lib/tokenize.cpp | 9 ++++++--- test/testsimplifyusing.cpp | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 1dbbf0e7719..eae3438d18d 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -2847,7 +2847,7 @@ bool Tokenizer::simplifyUsing() Token* end = tok->tokAt(3); while (end && !Token::Match(end, "[;,]")) { if (end->str() == "<" && end->link()) // skip template args - end =end->link()->next(); + end = end->link()->next(); else end = end->next(); } @@ -2855,7 +2855,7 @@ bool Tokenizer::simplifyUsing() continue; if (!end->tokAt(-1)->isNameOnly() || end->tokAt(-2)->isLiteral()) // e.g. operator=, operator""sv continue; - tok->insertToken(end->strAt(-1))->insertToken("="); + tok->insertToken(end->strAt(-1))->insertToken("=")->isSimplifiedTypedef(true); if (end->str() == ",") { // comma-separated list end->str(";"); end->insertToken("using"); @@ -2930,8 +2930,11 @@ bool Tokenizer::simplifyUsing() std::string scope = currentScope->fullName; Token *usingStart = tok; Token *start; - if (tok->strAt(2) == "=") + if (tok->strAt(2) == "=") { + if (currentScope->type == ScopeInfo3::Record && tok->tokAt(2)->isSimplifiedTypedef()) // don't simplify within class definition + continue; start = tok->tokAt(3); + } else start = tok->linkAt(2)->tokAt(3); Token *usingEnd = findSemicolon(start); diff --git a/test/testsimplifyusing.cpp b/test/testsimplifyusing.cpp index bfdf8b9a1d1..abf15dd0048 100644 --- a/test/testsimplifyusing.cpp +++ b/test/testsimplifyusing.cpp @@ -706,6 +706,24 @@ class TestSimplifyUsing : public TestFixture { ASSERT_EQUALS(expected, tok(code, Platform::Type::Native, /*debugwarnings*/ true)); ASSERT_EQUALS("", errout.str()); } + { + const char code[] = "template \n" + "class vector : public ::std::vector {\n" + "public:\n" + " using ::std::vector::vector;\n" + " vector() {}\n" + "};\n" + "vector v;\n"; + const char expected[] = "class vector ; " + "vector v ; " + "class vector : public :: std :: vector { " + "public: " + "using vector = :: std :: vector :: vector ; " + "vector ( ) { } " + "} ;"; + ASSERT_EQUALS(expected, tok(code, Platform::Type::Native, /*debugwarnings*/ true)); + ASSERT_EQUALS("", errout.str()); + } } void simplifyUsing8970() {