From c26752b56f1370f1fdbf1cd1dc15bc7cde754a65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Mon, 27 Oct 2025 15:22:24 +0100 Subject: [PATCH 1/2] Fixed #14129 (false positive: unusedPrivateFunction with __attribute__((unused))) --- lib/checkclass.cpp | 2 +- test/testunusedprivfunc.cpp | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index e0721531299..cf706d35069 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -1342,7 +1342,7 @@ void CheckClass::privateFunctions() while (!privateFuncs.empty()) { const auto& pf = privateFuncs.front(); - if (pf->token->isAttributeMaybeUnused()) { + if (pf->token->isAttributeMaybeUnused() || pf->token->isAttributeUnused()) { privateFuncs.pop_front(); continue; } diff --git a/test/testunusedprivfunc.cpp b/test/testunusedprivfunc.cpp index 537385d60aa..6b5462aa867 100644 --- a/test/testunusedprivfunc.cpp +++ b/test/testunusedprivfunc.cpp @@ -84,6 +84,7 @@ class TestUnusedPrivateFunction : public TestFixture { TEST_CASE(templateSimplification); //ticket #6183 TEST_CASE(maybeUnused); + TEST_CASE(attributeUnused); // #14129 TEST_CASE(trailingReturn); } @@ -890,6 +891,13 @@ class TestUnusedPrivateFunction : public TestFixture { ASSERT_EQUALS("", errout_str()); } + void attributeUnused() { + check("class C {\n" + " __attribute__((unused)) int f() { return 42; }\n" + "};"); + ASSERT_EQUALS("", errout_str()); + } + void trailingReturn() { check("struct B { virtual void f(); };\n" "struct D : B {\n" From 2b1df39dcdefca0af6c2104b9a83096cbe525b9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Mon, 27 Oct 2025 18:36:01 +0100 Subject: [PATCH 2/2] out of line definition --- lib/checkclass.cpp | 2 +- test/testunusedprivfunc.cpp | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index cf706d35069..53cff41d92c 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -1346,7 +1346,7 @@ void CheckClass::privateFunctions() privateFuncs.pop_front(); continue; } - if (pf->tokenDef && pf->tokenDef->isAttributeMaybeUnused()) { + if (pf->tokenDef && (pf->tokenDef->isAttributeMaybeUnused() || pf->tokenDef->isAttributeUnused())) { privateFuncs.pop_front(); continue; } diff --git a/test/testunusedprivfunc.cpp b/test/testunusedprivfunc.cpp index 6b5462aa867..5a364347163 100644 --- a/test/testunusedprivfunc.cpp +++ b/test/testunusedprivfunc.cpp @@ -896,6 +896,12 @@ class TestUnusedPrivateFunction : public TestFixture { " __attribute__((unused)) int f() { return 42; }\n" "};"); ASSERT_EQUALS("", errout_str()); + + check("class C {\n" + " __attribute__((unused)) int f();\n" + "};\n" + "int C::f() { return 42; }\n"); + ASSERT_EQUALS("", errout_str()); } void trailingReturn() {