diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index e0721531299..53cff41d92c 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -1342,11 +1342,11 @@ 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; } - 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 537385d60aa..5a364347163 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,19 @@ 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()); + + check("class C {\n" + " __attribute__((unused)) int f();\n" + "};\n" + "int C::f() { return 42; }\n"); + ASSERT_EQUALS("", errout_str()); + } + void trailingReturn() { check("struct B { virtual void f(); };\n" "struct D : B {\n"