diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index 6845b7310..7e0b9547d 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -747,8 +747,8 @@ bool CheckStl::checkIteratorPair(const Token* tok1, const Token* tok2) } if (Token::Match(tok1->astParent(), "%comp%|-")) { - if (astIsIntegral(tok1, false) || astIsIntegral(tok2, false) || astIsFloat(tok1, false) || - astIsFloat(tok2, false)) + if (astIsIntegral(tok1, true) || astIsIntegral(tok2, true) || + astIsFloat(tok1, true) || astIsFloat(tok2, true)) return false; } const Token* iter1 = getIteratorExpression(tok1); diff --git a/test/teststl.cpp b/test/teststl.cpp index b545a52fc..523a0c59b 100644 --- a/test/teststl.cpp +++ b/test/teststl.cpp @@ -1989,6 +1989,23 @@ private: " }\n" "}\n"); ASSERT_EQUALS("", errout.str()); + + check("bool f(const std::vector& a, const std::vector& b) {\n" // #11469 + " return (a.begin() - a.end()) == (b.begin() - b.end());\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); + + check("struct S {\n" + " const std::vector* vec() const { return &v; }\n" + " const std::vector v;\n" + "};\n" + "void f(const S& a, const S& b) {\n" + " if (a.vec()->begin() - a.vec()->end() != b.vec()->begin() - b.vec()->end()) {}\n" + "}\n"); + TODO_ASSERT_EQUALS("", + "[test.cpp:6]: (warning) Iterators to containers from different expressions 'a.vec()' and 'a.vec()' are used together.\n" + "[test.cpp:6]: (warning) Iterators to containers from different expressions 'b.vec()' and 'b.vec()' are used together.\n", + errout.str()); } void iteratorSameExpression() {