From 6f3e3f5e2ec03a3f91ffea1420bd3aef75e73151 Mon Sep 17 00:00:00 2001 From: Mark de Wever Date: Mon, 21 Apr 2014 16:39:44 +0200 Subject: [PATCH] Fixed #5701 (FP for std::unordered_map::operator[]; there is no const version) --- lib/checkclass.cpp | 8 ++++++-- test/testclass.cpp | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index 26f0abcff..2f6710bc3 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -1783,8 +1783,12 @@ bool CheckClass::checkConstFunc(const Scope *scope, const Function *func, bool& } else if (end->strAt(1) == "[") { if (end->varId()) { const Variable *var = end->variable(); - - if (var && Token::simpleMatch(var->typeStartToken(), "std :: map")) // operator[] changes a map + // The container contains the STL types whose operator[] is not a const. + // THIS ARRAY MUST BE ORDERED ALPHABETICALLY + static const char* const stl_containers [] = { + "map", "unordered_map" + }; + if (var && var->isStlType(stl_containers)) return false; } if (!jumpBackToken) diff --git a/test/testclass.cpp b/test/testclass.cpp index 5a04fb17e..b10386148 100644 --- a/test/testclass.cpp +++ b/test/testclass.cpp @@ -147,6 +147,7 @@ private: TEST_CASE(const59); // ticket #4646 TEST_CASE(const60); // ticket #3322 TEST_CASE(const61); // ticket #5606 + TEST_CASE(const62); // ticket #5701 TEST_CASE(const_handleDefaultParameters); TEST_CASE(const_passThisToMemberOfOtherClass); TEST_CASE(assigningPointerToPointerIsNotAConstOperation); @@ -4828,6 +4829,19 @@ private: ASSERT_EQUALS("", errout.str()); } + void const62() { + checkConst("class A {\n" + " private:\n" + " std::unordered_map _hash;\n" + " public:\n" + " A() : _hash() {}\n" + " unsigned int fetch(unsigned int key)\n" // cannot be 'const' + " {\n" + " return _hash[key];\n" + " }\n" + "};"); + ASSERT_EQUALS("", errout.str()); + } void const_handleDefaultParameters() { checkConst("struct Foo {\n"