diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index dd15ca06641..49613c06914 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -988,6 +988,14 @@ void CheckClass::initializeVarList(const Function &func, std::listisConst() && !member->isStatic()) { assignAllVar(usage); } + + // const method, assume it assigns all mutable members + else if (member->isConst()) { + for (Usage& i: usage) { + if (i.var->isMutable()) + i.assign = true; + } + } } // not member function diff --git a/test/testconstructors.cpp b/test/testconstructors.cpp index 55925648811..418025e33c9 100644 --- a/test/testconstructors.cpp +++ b/test/testconstructors.cpp @@ -116,6 +116,7 @@ class TestConstructors : public TestFixture { TEST_CASE(initvar_chained_assign); // BUG 2270433 TEST_CASE(initvar_2constructors); // BUG 2270353 TEST_CASE(initvar_constvar); + TEST_CASE(initvar_mutablevar); TEST_CASE(initvar_staticvar); TEST_CASE(initvar_brace_init); TEST_CASE(initvar_union); @@ -1194,6 +1195,18 @@ class TestConstructors : public TestFixture { } + void initvar_mutablevar() { + check("class Foo {\n" + "public:\n" + " Foo() { update(); }\n" + "private:\n" + " void update() const;\n" + " mutable int x;\n" + "};"); + ASSERT_EQUALS("", errout.str()); + } + + void initvar_staticvar() { check("class Fred\n" "{\n"