diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 4e00e0d184e..f273cd623ec 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -3389,12 +3389,17 @@ bool Tokenizer::simplifyUsing() } else if (fpArgList && fpQual && Token::Match(tok1->next(), "%name%")) { // function pointer const bool isFuncDecl = Token::simpleMatch(tok1->tokAt(2), "("); - TokenList::copyTokens(tok1->next(), fpArgList, usingEnd->previous()); + Token *dest = tok1->next(); + while (Token::Match(dest, "%name% :: %name%")) + dest = dest->tokAt(2); + TokenList::copyTokens(dest, fpArgList, usingEnd->previous()); Token* const copyEnd = TokenList::copyTokens(tok1, start, fpQual->link()->previous()); Token* leftPar = copyEnd->previous(); while (leftPar->str() != "(") leftPar = leftPar->previous(); - Token* const insertTok = isFuncDecl ? copyEnd->linkAt(2) : copyEnd->next(); + Token *insertTok = isFuncDecl ? copyEnd->linkAt(2) : copyEnd->next(); + while (Token::Match(insertTok, "%name% :: %name%")) + insertTok = insertTok->tokAt(2); Token* const rightPar = insertTok->insertToken(")"); Token::createMutualLinks(leftPar, rightPar); tok1->deleteThis(); diff --git a/test/testsimplifyusing.cpp b/test/testsimplifyusing.cpp index 160f80762a8..5210d484d40 100644 --- a/test/testsimplifyusing.cpp +++ b/test/testsimplifyusing.cpp @@ -78,6 +78,7 @@ class TestSimplifyUsing : public TestFixture { TEST_CASE(simplifyUsing38); TEST_CASE(simplifyUsing39); TEST_CASE(simplifyUsing40); + TEST_CASE(simplifyUsing41); TEST_CASE(simplifyUsing8970); TEST_CASE(simplifyUsing8971); @@ -948,6 +949,13 @@ class TestSimplifyUsing : public TestFixture { ASSERT_EQUALS(expected, tok(code)); } + void simplifyUsing41() { + const char code[] = "using FpHandler = void(*)(const SourceLocation&);\n" + "inline FpHandler AssertImpl::m_fpHandler = nullptr;\n"; + const char expected[] = "void ( * AssertImpl :: m_fpHandler ) ( const SourceLocation & ) ; m_fpHandler = nullptr ;"; + ASSERT_EQUALS(expected, tok(code)); + } + void simplifyUsing8970() { const char code[] = "using V = std::vector;\n" "struct A {\n"