From 9f6a36c1a8a417838b04ceeb146b0bd2f0c0c1b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Thu, 3 Feb 2022 11:04:02 +0100 Subject: [PATCH] Revert "Fix #10671: functionConst FN with begin/end and const_iterator (#3749)" This reverts commit 2cacb13f857d4b35619e559f0996ff63996483a3. --- lib/checkclass.cpp | 9 ++------- test/cfg/std.cpp | 43 ------------------------------------------- test/testclass.cpp | 19 ------------------- 3 files changed, 2 insertions(+), 69 deletions(-) diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index d5e13004e..ded711c51 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -2216,13 +2216,8 @@ bool CheckClass::checkConstFunc(const Scope *scope, const Function *func, bool& const Variable *var = lastVarTok->variable(); if (!var) return false; - if ((var->isStlType() // assume all std::*::size() and std::*::empty() are const - && (Token::Match(end, "size|empty|cend|crend|cbegin|crbegin|max_size|length|count|capacity|get_allocator|c_str|str ( )") || Token::Match(end, "rfind|copy"))) || - - (lastVarTok->valueType() && lastVarTok->valueType()->container && - ((lastVarTok->valueType()->container->getYield(end->str()) == Library::Container::Yield::START_ITERATOR) || - (lastVarTok->valueType()->container->getYield(end->str()) == Library::Container::Yield::END_ITERATOR)) - && (tok1->previous()->isComparisonOp() || (tok1->previous()->isAssignmentOp() && Token::Match(tok1->tokAt(-2)->variable()->typeEndToken(), "const_iterator|const_reverse_iterator"))))) + if (var->isStlType() // assume all std::*::size() and std::*::empty() are const + && (Token::Match(end, "size|empty|cend|crend|cbegin|crbegin|max_size|length|count|capacity|get_allocator|c_str|str ( )") || Token::Match(end, "rfind|copy"))) ; else if (!var->typeScope() || !isConstMemberFunc(var->typeScope(), end)) return false; diff --git a/test/cfg/std.cpp b/test/cfg/std.cpp index fc15910ea..3e06bd92a 100644 --- a/test/cfg/std.cpp +++ b/test/cfg/std.cpp @@ -3636,46 +3636,3 @@ void stdbind() // cppcheck-suppress unreadVariable auto f2 = std::bind(stdbind_helper, 10); } - -class A -{ - std::vector m_str; - -public: - - A() {} - - // cppcheck-suppress functionConst - void begin_const_iterator(void) - { - for (std::vector::const_iterator it = m_str.begin(); it != m_str.end(); ++it) {;} - } - // cppcheck-suppress functionConst - void cbegin_const_iterator(void) - { - for (std::vector::const_iterator it = m_str.cbegin(); it != m_str.cend(); ++it) {;} - } - // cppcheck-suppress functionConst - void crbegin_const_iterator(void) - { - for (std::vector::const_reverse_iterator it = m_str.crbegin(); it != m_str.crend(); ++it) {;} - } - // cppcheck-suppress functionConst - void rbegin_const_iterator(void) - { - for (std::vector::const_reverse_iterator it = m_str.rbegin(); it != m_str.rend(); ++it) {;} - } - // cppcheck-suppress functionConst - void cbegin_auto(void) - { - for (auto it = m_str.cbegin(); it != m_str.cend(); ++it) {;} - } - void baz_begin_no_const_iterator(void) - { - for (std::vector::iterator it = m_str.begin(); it != m_str.end(); ++it) {;} - } - void rbegin_no_const_iterator(void) - { - for (std::vector::reverse_iterator it = m_str.rbegin(); it != m_str.rend(); ++it) {;} - } -}; diff --git a/test/testclass.cpp b/test/testclass.cpp index ce573da78..72689b884 100644 --- a/test/testclass.cpp +++ b/test/testclass.cpp @@ -54,12 +54,6 @@ private: " free\n" " \n" " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" ""; tinyxml2::XMLDocument doc; doc.Parse(xmldata, sizeof(xmldata)); @@ -190,7 +184,6 @@ private: TEST_CASE(const71); // ticket #10146 TEST_CASE(const72); // ticket #10520 TEST_CASE(const73); // ticket #10735 - TEST_CASE(const74); // ticket #10671 TEST_CASE(const_handleDefaultParameters); TEST_CASE(const_passThisToMemberOfOtherClass); TEST_CASE(assigningPointerToPointerIsNotAConstOperation); @@ -5926,18 +5919,6 @@ private: ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3]: (style, inconclusive) Technically the member function 'S::f' can be const.\n", errout.str()); } - void const74() { // #10671 - checkConst("class A {\n" - " std::vector m_str;\n" - "public:\n" - " A() {}\n" - " void bar(void) {\n" - " for(std::vector::const_iterator it = m_str.begin(); it != m_str.end(); ++it) {;}\n" - " }\n" - "};"); - ASSERT_EQUALS("[test.cpp:5]: (style, inconclusive) Technically the member function 'A::bar' can be const.\n", errout.str()); - } - void const_handleDefaultParameters() { checkConst("struct Foo {\n" " void foo1(int i, int j = 0) {\n"