diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index 931b2cf5d..ba4d6eda7 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -1252,16 +1252,17 @@ void CheckUnusedVar::checkStructMemberUsage() } } - if (! used) { - unusedStructMemberError(tok->next(), structname, *varname); + if (!used) { + unusedStructMemberError(tok->next(), structname, *varname, tok->scope()->type == Scope::eUnion); } } } } -void CheckUnusedVar::unusedStructMemberError(const Token *tok, const std::string &structname, const std::string &varname) +void CheckUnusedVar::unusedStructMemberError(const Token *tok, const std::string &structname, const std::string &varname, bool isUnion) { - reportError(tok, Severity::style, "unusedStructMember", "struct or union member '" + structname + "::" + varname + "' is never used."); + const char* prefix = isUnion ? "union member '" : "struct member '"; + reportError(tok, Severity::style, "unusedStructMember", std::string(prefix) + structname + "::" + varname + "' is never used."); } bool CheckUnusedVar::isRecordTypeWithoutSideEffects(const Type* type) diff --git a/lib/checkunusedvar.h b/lib/checkunusedvar.h index fbed74ee7..d0923216a 100644 --- a/lib/checkunusedvar.h +++ b/lib/checkunusedvar.h @@ -75,7 +75,7 @@ private: bool isEmptyType(const Type* type); // Error messages.. - void unusedStructMemberError(const Token *tok, const std::string &structname, const std::string &varname); + void unusedStructMemberError(const Token *tok, const std::string &structname, const std::string &varname, bool isUnion = false); void unusedVariableError(const Token *tok, const std::string &varname); void allocatedButUnusedVariableError(const Token *tok, const std::string &varname); void unreadVariableError(const Token *tok, const std::string &varname); diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index 7bad415d8..96d1fcb54 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -208,9 +208,20 @@ private: " int b;\n" " int c;\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (style) struct or union member 'abc::a' is never used.\n" - "[test.cpp:4]: (style) struct or union member 'abc::b' is never used.\n" - "[test.cpp:5]: (style) struct or union member 'abc::c' is never used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) struct member 'abc::a' is never used.\n" + "[test.cpp:4]: (style) struct member 'abc::b' is never used.\n" + "[test.cpp:5]: (style) struct member 'abc::c' is never used.\n", errout.str()); + + checkStructMemberUsage("union abc\n" + "{\n" + " int a;\n" + " int b;\n" + " int c;\n" + "};"); + ASSERT_EQUALS("[test.cpp:3]: (style) union member 'abc::a' is never used.\n" + "[test.cpp:4]: (style) union member 'abc::b' is never used.\n" + "[test.cpp:5]: (style) union member 'abc::c' is never used.\n", errout.str()); + } void structmember2() { @@ -418,7 +429,7 @@ private: "{\n" " ab.b = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) struct or union member 'AB::a' is never used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) struct member 'AB::a' is never used.\n", errout.str()); } void functionVariableUsage(const char code[], const char filename[]="test.cpp") {