diff --git a/cfg/std.cfg b/cfg/std.cfg index bcea6e88b28..9a89f910fd0 100644 --- a/cfg/std.cfg +++ b/cfg/std.cfg @@ -8201,6 +8201,7 @@ initializer list (7) string& replace (const_iterator i1, const_iterator i2, init false + @@ -8215,6 +8216,7 @@ initializer list (7) string& replace (const_iterator i1, const_iterator i2, init false + diff --git a/lib/checkassert.cpp b/lib/checkassert.cpp index 3ed3ae12aa7..b6ad58b3510 100644 --- a/lib/checkassert.cpp +++ b/lib/checkassert.cpp @@ -70,8 +70,9 @@ void CheckAssert::assertWithSideEffects() continue; if (tmp->str() == "get" && Token::simpleMatch(tmp->astParent(), ".") && astIsSmartPointer(tmp->astParent()->astOperand1())) continue; - if (f->containerYield == Library::Container::Yield::START_ITERATOR || // bailout for std::begin/end - f->containerYield == Library::Container::Yield::END_ITERATOR) + if (f->containerYield == Library::Container::Yield::START_ITERATOR || // bailout for std::begin/end/prev/next + f->containerYield == Library::Container::Yield::END_ITERATOR || + f->containerYield == Library::Container::Yield::ITERATOR) continue; sideEffectInAssertError(tmp, mSettings->library.getFunctionName(tmp)); } diff --git a/test/cfg/std.cpp b/test/cfg/std.cpp index b949f9db9bc..51cf350bbc8 100644 --- a/test/cfg/std.cpp +++ b/test/cfg/std.cpp @@ -5041,3 +5041,9 @@ void assertWithSideEffect_std_begin(const std::vector& v) { return a.size() < b.size(); })); // cppcheck-suppress checkLibraryNoReturn } + +void assertWithSideEffect_std_prev_next(const std::vector& v, std::vector::const_iterator it) { + assert(std::prev(it, 1) == v.begin()); + // cppcheck-suppress checkLibraryNoReturn + assert(std::next(it, 1) == v.end()); +} diff --git a/test/testautovariables.cpp b/test/testautovariables.cpp index 4951d8c0878..3527b744727 100644 --- a/test/testautovariables.cpp +++ b/test/testautovariables.cpp @@ -2442,7 +2442,7 @@ class TestAutoVariables : public TestFixture { " return std::next(it);\n" "}"); ASSERT_EQUALS( - "[test.cpp:3] -> [test.cpp:4] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning object that points to local variable 'x' that will be invalid when returning.\n", + "[test.cpp:3] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning iterator to local container 'x' that will be invalid when returning.\n", errout_str()); check("auto f() {\n"