diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index 755b77517c7..fd7fbfc8604 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -1549,6 +1549,14 @@ void CheckUnusedVar::checkStructMemberUsage() use = true; break; } + // Member referenced in offsetof + if (Token::Match(tok, ("offsetof ( struct| " + scope.className + " , %name%").c_str())) { + tok = tok->astSibling()->astOperand2(); + if (tok->str() == var.name()) { + use = true; + break; + } + } if (tok->variable() != &var) continue; if (tok != var.nameToken()) { diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index 3d57b789c02..88a6f0ed0e5 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -70,6 +70,7 @@ class TestUnusedVar : public TestFixture { TEST_CASE(structmember23); TEST_CASE(structmember24); // #10847 TEST_CASE(structmember25); + TEST_CASE(structmember26); // #13345 TEST_CASE(structmember_macro); TEST_CASE(classmember); @@ -1962,6 +1963,14 @@ class TestUnusedVar : public TestFixture { errout_str()); } + void structmember26() { // #13345 + checkStructMemberUsage("struct foobar {\n" + " char unused;\n" + "};\n" + "size_t offset_unused = offsetof(struct foobar, unused);\n"); + ASSERT_EQUALS("", errout_str()); + } + void structmember_macro() { checkStructMemberUsageP("#define S(n) struct n { int a, b, c; };\n" "S(unused);\n");