diff --git a/lib/checkother.cpp b/lib/checkother.cpp index 094f71edb..7c178fc8a 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -622,15 +622,11 @@ static void eraseNotLocalArg(std::map& container, co static void eraseMemberAssignments(const unsigned int varId, std::map > &membervars, std::map &varAssignments) { - if (varAssignments.empty() || membervars.empty()) - return; const std::map >::const_iterator it = membervars.find(varId); if (it != membervars.end()) { const std::set &v = it->second; - for (std::set::const_iterator vit = v.begin(); vit != v.end(); ++vit) { + for (std::set::const_iterator vit = v.begin(); vit != v.end(); ++vit) varAssignments.erase(*vit); - eraseMemberAssignments(*vit, membervars, varAssignments); - } } } diff --git a/test/testother.cpp b/test/testother.cpp index 889c17ac0..d8ae5830d 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -6392,6 +6392,18 @@ private: " ab->b = 2;\n" "}"); ASSERT_EQUALS("", errout.str()); + + // don't crash + check("struct data {\n" + " struct { int i; } fc;\n" + "};\n" + "struct state {\n" + " struct data d[123];\n" + "};\n" + "void func(struct state *s) {\n" + " s->foo[s->x++] = 2;\n" + " s->d[1].fc.i++;\n" + "}"); } void redundantMemWrite() {