diff --git a/cfg/cppcheck-cfg.rng b/cfg/cppcheck-cfg.rng
index 004e931b4..f3a3c1f7b 100644
--- a/cfg/cppcheck-cfg.rng
+++ b/cfg/cppcheck-cfg.rng
@@ -698,6 +698,7 @@
push
pop
find
+ find-const
insert
erase
change-content
diff --git a/cfg/std.cfg b/cfg/std.cfg
index 23616f160..cc9785244 100644
--- a/cfg/std.cfg
+++ b/cfg/std.cfg
@@ -8758,12 +8758,12 @@ initializer list (7) string& replace (const_iterator i1, const_iterator i2, init
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/lib/astutils.cpp b/lib/astutils.cpp
index 49fe0fc02..949d79b70 100644
--- a/lib/astutils.cpp
+++ b/lib/astutils.cpp
@@ -1966,7 +1966,7 @@ bool isConstFunctionCall(const Token* ftok, const Library& library)
return false;
if (container->getYield(ftok->str()) != Library::Container::Yield::NO_YIELD)
return true;
- if (container->getAction(ftok->str()) == Library::Container::Action::FIND)
+ if (container->getAction(ftok->str()) == Library::Container::Action::FIND_CONST)
return true;
return false;
} else if (const Library::Function* lf = library.getFunction(ftok)) {
@@ -1974,7 +1974,7 @@ bool isConstFunctionCall(const Token* ftok, const Library& library)
return true;
if (lf->containerYield != Library::Container::Yield::NO_YIELD)
return true;
- if (lf->containerAction == Library::Container::Action::FIND)
+ if (lf->containerAction == Library::Container::Action::FIND_CONST)
return true;
return false;
} else {
diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp
index fcf32f1f1..3d448c85f 100644
--- a/lib/checkstl.cpp
+++ b/lib/checkstl.cpp
@@ -1518,7 +1518,9 @@ void CheckStl::if_find()
}
}
- if (container && container->getAction(funcTok->str()) == Library::Container::Action::FIND) {
+ Library::Container::Action action{};
+ if (container &&
+ ((action = container->getAction(funcTok->str())) == Library::Container::Action::FIND || action == Library::Container::Action::FIND_CONST)) {
if (if_findCompare(funcTok->next(), container->stdStringLike))
continue;
diff --git a/lib/library.cpp b/lib/library.cpp
index bcf7dab7d..593e76448 100644
--- a/lib/library.cpp
+++ b/lib/library.cpp
@@ -175,6 +175,8 @@ Library::Container::Action Library::Container::actionFrom(const std::string& act
return Container::Action::POP;
if (actionName == "find")
return Container::Action::FIND;
+ if (actionName == "find-const")
+ return Container::Action::FIND_CONST;
if (actionName == "insert")
return Container::Action::INSERT;
if (actionName == "erase")
diff --git a/lib/library.h b/lib/library.h
index e27ca3842..1f20964b8 100644
--- a/lib/library.h
+++ b/lib/library.h
@@ -197,6 +197,7 @@ public:
PUSH,
POP,
FIND,
+ FIND_CONST,
INSERT,
ERASE,
CHANGE_CONTENT,
diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp
index 78fde897d..eebe52fd2 100644
--- a/lib/valueflow.cpp
+++ b/lib/valueflow.cpp
@@ -8300,6 +8300,7 @@ bool ValueFlow::isContainerSizeChanged(const Token* tok, int indirect, const Set
}
break;
case Library::Container::Action::FIND:
+ case Library::Container::Action::FIND_CONST:
case Library::Container::Action::CHANGE_CONTENT:
case Library::Container::Action::CHANGE_INTERNAL:
break;
diff --git a/test/testlibrary.cpp b/test/testlibrary.cpp
index 508ee938d..430ac100f 100644
--- a/test/testlibrary.cpp
+++ b/test/testlibrary.cpp
@@ -811,6 +811,7 @@ private:
" \n"
" \n"
" \n"
+ " \n"
" \n"
" \n"
" \n"
@@ -851,6 +852,7 @@ private:
ASSERT_EQ(Library::Container::Action::PUSH, A.getAction("push_back"));
ASSERT_EQ(Library::Container::Action::POP, A.getAction("pop_back"));
ASSERT_EQ(Library::Container::Action::FIND, A.getAction("find"));
+ ASSERT_EQ(Library::Container::Action::FIND_CONST, A.getAction("cfind"));
ASSERT_EQ(Library::Container::Action::NO_ACTION, A.getAction("foo"));
ASSERT_EQUALS(B.type_templateArgNo, 1);