diff --git a/lib/checkother.cpp b/lib/checkother.cpp index b44c82ac0..094f71edb 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -622,6 +622,8 @@ 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; diff --git a/test/testother.cpp b/test/testother.cpp index 794915732..889c17ac0 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -2146,6 +2146,20 @@ private: " }\n" "}", 0, false, false, false, false); ASSERT_EQUALS("", errout.str()); + + // Ticket #5158 "segmentation fault (valid code)" + check("typedef struct ct_data_s {\n" + " union {\n" + " char freq;\n" + " } fc;\n" + "} ct_data;\n" + "typedef struct internal_state {\n" + " struct ct_data_s dyn_ltree[10];\n" + "} deflate_state;\n" + "void f(deflate_state *s) {\n" + " s->dyn_ltree[0].fc.freq++;\n" + "}\n", 0, false, false, false, false); + ASSERT_EQUALS("", errout.str()); } void switchRedundantOperationTest() {