From 08307a9c9917908ea9729ac8e41673cda3d89056 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 16 Jan 2026 13:34:50 +0100 Subject: [PATCH 1/9] Update testsimplifyusing.cpp --- test/testsimplifyusing.cpp | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/test/testsimplifyusing.cpp b/test/testsimplifyusing.cpp index fa067f822ce..b0ee773d82a 100644 --- a/test/testsimplifyusing.cpp +++ b/test/testsimplifyusing.cpp @@ -72,7 +72,8 @@ class TestSimplifyUsing : public TestFixture { TEST_CASE(simplifyUsing33); TEST_CASE(simplifyUsing34); TEST_CASE(simplifyUsing35); - TEST_CASE(simplifyUsing36); + TEST_CASE(simplifyUsing36); + TEST_CASE(simplifyUsing37); TEST_CASE(simplifyUsing8970); TEST_CASE(simplifyUsing8971); @@ -882,6 +883,23 @@ class TestSimplifyUsing : public TestFixture { ASSERT_EQUALS("", errout_str()); } + void simplifyUsing37() { + const char code1[] = "using fp1_t = int(*)(int);\n" + "using fp2_t = int(* const)(int);\n" + "fp1_t fp1;\n" + "fp2_t fp2;\n"; + const char expected1[] = "int ( * fp1 ) ( int ) ; int ( * const fp2 ) ( int ) ;"; + ASSERT_EQUALS(expected1, tok(code1)); + ASSERT_EQUALS("", errout_str()); + + const char code2[] = "using f_t = int(int);\n" + "f_t* fp;\n"; + const char expected2[] = "int ( * fp1 ) ( int ) ; int ( * const fp2 ) ( int ) ;"; + const char actual2[] = "using f_t = int ( ) ; f_t * fp ;"; + TODO_ASSERT_EQUALS(expected2, actual2, tok(code2)); + TODO_ASSERT_EQUALS("", "[test.cpp:1:1]: (debug) Failed to parse 'using f_t = int ( ) ;'. The checking continues anyway. [simplifyUsing]\n", errout_str()); + } + void simplifyUsing8970() { const char code[] = "using V = std::vector;\n" "struct A {\n" From 8be401dcfb0ccc4efa06cfc49a2846aeab34a811 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 16 Jan 2026 13:39:23 +0100 Subject: [PATCH 2/9] Update tokenize.cpp --- lib/tokenize.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 96c69bb4dd9..c97ddd75275 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -3211,6 +3211,8 @@ bool Tokenizer::simplifyUsing() } Token * arrayStart = nullptr; + Token * fpArgList = nullptr; + Token * fpQual = nullptr; // parse the type Token *type = start; @@ -3310,6 +3312,15 @@ bool Tokenizer::simplifyUsing() } while (type && type->str() == "["); } + // check for function pointer + if (type && type->str() == "(") { + if (Token::simpleMatch(type->link(), ") (")) { + fpArgList = type->link()->next(); + fpQual = type; + type = type->link()->next()->link()->next(); + } + } + // make sure we are in a good state if (!tok1 || !tok1->next()) break; // bail @@ -3325,6 +3336,14 @@ bool Tokenizer::simplifyUsing() tok1->deleteThis(); substitute = true; } + // function pointer + } else if (fpArgList && fpQual && Token::Match(tok1->next(), "%name%")) { + TokenList::copyTokens(tok1->next(), fpArgList, usingEnd->previous()); + Token* const copyEnd = TokenList::copyTokens(tok1, start, fpQual->link()->previous()); + tok1->deleteThis(); + Token* const rightPar = copyEnd->next()->insertToken(")"); + Token::createMutualLinks(tok1->next(), rightPar); + substitute = true; } else { // add some qualification back if needed std::string removed1 = std::move(removed); From 92d96c58bc3a66df6c4d51bdf8bc096749e8dc49 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 16 Jan 2026 13:41:23 +0100 Subject: [PATCH 3/9] Update testsimplifyusing.cpp --- test/testsimplifyusing.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/testsimplifyusing.cpp b/test/testsimplifyusing.cpp index b0ee773d82a..5df19e1cd79 100644 --- a/test/testsimplifyusing.cpp +++ b/test/testsimplifyusing.cpp @@ -72,7 +72,7 @@ class TestSimplifyUsing : public TestFixture { TEST_CASE(simplifyUsing33); TEST_CASE(simplifyUsing34); TEST_CASE(simplifyUsing35); - TEST_CASE(simplifyUsing36); + TEST_CASE(simplifyUsing36); TEST_CASE(simplifyUsing37); TEST_CASE(simplifyUsing8970); From 9b6d401d54daabb1f1600a46906112ea0dc91123 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 16 Jan 2026 14:24:39 +0100 Subject: [PATCH 4/9] Update tokenize.cpp --- lib/tokenize.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index c97ddd75275..6b92e431dba 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -3336,13 +3336,13 @@ bool Tokenizer::simplifyUsing() tok1->deleteThis(); substitute = true; } - // function pointer } else if (fpArgList && fpQual && Token::Match(tok1->next(), "%name%")) { + // function pointer TokenList::copyTokens(tok1->next(), fpArgList, usingEnd->previous()); Token* const copyEnd = TokenList::copyTokens(tok1, start, fpQual->link()->previous()); tok1->deleteThis(); Token* const rightPar = copyEnd->next()->insertToken(")"); - Token::createMutualLinks(tok1->next(), rightPar); + Token::createMutualLinks(tok1->next(), rightPar); substitute = true; } else { // add some qualification back if needed @@ -6950,8 +6950,7 @@ void Tokenizer::simplifyFunctionParameters() } // Find the function e.g. foo( x ) or foo( x, y ) - else if (Token::Match(tok, "%name% ( %name% [,)]") && - !(tok->strAt(-1) == ":" || tok->strAt(-1) == "," || tok->strAt(-1) == "::")) { + else if (Token::Match(tok, "%name% ( %name% [,)]") && !Token::Match(tok->tokAt(-1), ":|,|::|=")) { // We have found old style function, now we need to change it // First step: Get list of argument names in parentheses From cf1dce2b6910a20d55d4e3f48db7f4c68455791d Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 16 Jan 2026 14:29:46 +0100 Subject: [PATCH 5/9] Update testsimplifyusing.cpp --- test/testsimplifyusing.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/testsimplifyusing.cpp b/test/testsimplifyusing.cpp index 5df19e1cd79..2ca12267c96 100644 --- a/test/testsimplifyusing.cpp +++ b/test/testsimplifyusing.cpp @@ -893,11 +893,11 @@ class TestSimplifyUsing : public TestFixture { ASSERT_EQUALS("", errout_str()); const char code2[] = "using f_t = int(int);\n" - "f_t* fp;\n"; - const char expected2[] = "int ( * fp1 ) ( int ) ; int ( * const fp2 ) ( int ) ;"; - const char actual2[] = "using f_t = int ( ) ; f_t * fp ;"; + "f_t* fp;\n"; + const char expected2[] = "int ( * fp ) ( int ) ;"; + const char actual2[] = "using f_t = int ( int ) ; f_t * fp ;"; TODO_ASSERT_EQUALS(expected2, actual2, tok(code2)); - TODO_ASSERT_EQUALS("", "[test.cpp:1:1]: (debug) Failed to parse 'using f_t = int ( ) ;'. The checking continues anyway. [simplifyUsing]\n", errout_str()); + TODO_ASSERT_EQUALS("", "[test.cpp:1:1]: (debug) Failed to parse 'using f_t = int ( int ) ;'. The checking continues anyway. [simplifyUsing]\n", errout_str()); } void simplifyUsing8970() { From f23342f642490463e66bc148e84d5c247c5d5ea4 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 16 Jan 2026 16:08:57 +0100 Subject: [PATCH 6/9] Update tokenize.cpp --- lib/tokenize.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 6b92e431dba..35b564bd474 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -3317,7 +3317,10 @@ bool Tokenizer::simplifyUsing() if (Token::simpleMatch(type->link(), ") (")) { fpArgList = type->link()->next(); fpQual = type; - type = type->link()->next()->link()->next(); + type = type->link()->linkAt(1)->next(); + } else if (type->link()->next() == usingEnd) { + fpArgList = type; + type = usingEnd; } } @@ -3344,6 +3347,16 @@ bool Tokenizer::simplifyUsing() Token* const rightPar = copyEnd->next()->insertToken(")"); Token::createMutualLinks(tok1->next(), rightPar); substitute = true; + } else if (fpArgList && !fpQual && Token::Match(tok1->next(), "* const| %name%")) { + // function pointer + Token* const dest = tok1->tokAt(tok1->strAt(2) == "const" ? 3 : 2); + Token* const copyEndArgs = TokenList::copyTokens(dest, fpArgList, usingEnd->previous()); + Token* const copyEndRet = TokenList::copyTokens(tok1, start, fpArgList->previous()); + Token* const leftPar = copyEndRet->insertToken("("); + Token* const rightPar = copyEndArgs->link()->tokAt(-1)->insertToken(")"); + Token::createMutualLinks(leftPar, rightPar); + tok1->deleteThis(); + substitute = true; } else { // add some qualification back if needed std::string removed1 = std::move(removed); From a087f0a7af3104337ea744ef3856539fa27b4051 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 16 Jan 2026 16:12:35 +0100 Subject: [PATCH 7/9] Update testsimplifyusing.cpp --- test/testsimplifyusing.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/testsimplifyusing.cpp b/test/testsimplifyusing.cpp index 2ca12267c96..349eb414e5c 100644 --- a/test/testsimplifyusing.cpp +++ b/test/testsimplifyusing.cpp @@ -893,11 +893,11 @@ class TestSimplifyUsing : public TestFixture { ASSERT_EQUALS("", errout_str()); const char code2[] = "using f_t = int(int);\n" - "f_t* fp;\n"; - const char expected2[] = "int ( * fp ) ( int ) ;"; - const char actual2[] = "using f_t = int ( int ) ; f_t * fp ;"; - TODO_ASSERT_EQUALS(expected2, actual2, tok(code2)); - TODO_ASSERT_EQUALS("", "[test.cpp:1:1]: (debug) Failed to parse 'using f_t = int ( int ) ;'. The checking continues anyway. [simplifyUsing]\n", errout_str()); + "f_t* fp1;\n" + "f_t* const fp2;\n"; + const char expected2[] = "int ( * fp1 ) ( int ) ; int ( * const fp2 ) ( int ) ;"; + ASSERT_EQUALS(expected2, tok(code2)); + ASSERT_EQUALS("", errout_str()); } void simplifyUsing8970() { From 43b51dbcae6af97e7803886953b195a22ad6183c Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Fri, 16 Jan 2026 20:03:26 +0100 Subject: [PATCH 8/9] Format --- lib/tokenize.cpp | 2 +- test/testsimplifyusing.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 35b564bd474..dce13cb7dd2 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -3351,7 +3351,7 @@ bool Tokenizer::simplifyUsing() // function pointer Token* const dest = tok1->tokAt(tok1->strAt(2) == "const" ? 3 : 2); Token* const copyEndArgs = TokenList::copyTokens(dest, fpArgList, usingEnd->previous()); - Token* const copyEndRet = TokenList::copyTokens(tok1, start, fpArgList->previous()); + Token* const copyEndRet = TokenList::copyTokens(tok1, start, fpArgList->previous()); Token* const leftPar = copyEndRet->insertToken("("); Token* const rightPar = copyEndArgs->link()->tokAt(-1)->insertToken(")"); Token::createMutualLinks(leftPar, rightPar); diff --git a/test/testsimplifyusing.cpp b/test/testsimplifyusing.cpp index 349eb414e5c..c73e4c3ac1d 100644 --- a/test/testsimplifyusing.cpp +++ b/test/testsimplifyusing.cpp @@ -893,8 +893,8 @@ class TestSimplifyUsing : public TestFixture { ASSERT_EQUALS("", errout_str()); const char code2[] = "using f_t = int(int);\n" - "f_t* fp1;\n" - "f_t* const fp2;\n"; + "f_t* fp1;\n" + "f_t* const fp2;\n"; const char expected2[] = "int ( * fp1 ) ( int ) ; int ( * const fp2 ) ( int ) ;"; ASSERT_EQUALS(expected2, tok(code2)); ASSERT_EQUALS("", errout_str()); From 7f606853c9ae5be86de1bf6bc49e5ec6248655d7 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Fri, 16 Jan 2026 20:06:40 +0100 Subject: [PATCH 9/9] Remove suppression --- .github/workflows/CI-unixish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CI-unixish.yml b/.github/workflows/CI-unixish.yml index e37d88767ec..14682a41a56 100644 --- a/.github/workflows/CI-unixish.yml +++ b/.github/workflows/CI-unixish.yml @@ -716,7 +716,7 @@ jobs: ./cppcheck $selfcheck_options $cppcheck_options --cppcheck-build-dir=b1 --addon=naming.json --enable=internal lib || ec=1 # check gui with qt settings mkdir b2 - ./cppcheck $selfcheck_options $cppcheck_options $gui_options --cppcheck-build-dir=b2 --addon=naming.json --suppress=simplifyUsing:*/moc_*.cpp -Icmake.output/gui -Ifrontend -Igui gui/*.cpp cmake.output/gui || ec=1 + ./cppcheck $selfcheck_options $cppcheck_options $gui_options --cppcheck-build-dir=b2 --addon=naming.json -Icmake.output/gui -Ifrontend -Igui gui/*.cpp cmake.output/gui || ec=1 # self check test and tools ./cppcheck $selfcheck_options $cppcheck_options -Ifrontend -Icli test/*.cpp || ec=1 ./cppcheck $selfcheck_options $cppcheck_options -Icli tools/dmake/*.cpp || ec=1