| #include <iterator> |
| #include <utility> |
| #include <vector> |
| |
| // Test that reverse iterator are correctly checked when wrapped via some |
| // constructs like Chromium's `base::ReversedAdapter` iterator. |
| |
| template <typename T> |
| class Reversed { |
| public: |
| explicit Reversed(T& t) : t_(t) {} |
| using Iterator = decltype(std::rbegin(std::declval<T&>())); |
| Iterator begin() const { return std::rbegin(t_); } |
| Iterator end() const { return std::rend(t_); } |
| private: |
| T& t_; |
| }; // namespace internal |
| |
| void ReversedIteratorValid(std::vector<int>& v){ |
| auto it = Reversed(v).begin(); |
| if (it == Reversed(v).end()) { |
| return; |
| } |
| *it = 10; |
| } |
| |
| void ReversedIteratorInvalid(std::vector<int>& v){ |
| auto it = Reversed(v).begin(); |
| // TODO(329133423): This should emit a warning. |
| *it = 10; |
| } |
| |
| void ReversedIteratorForLoopValid(std::vector<int>& v){ |
| for(auto& i : Reversed(v)) { |
| i = 0; |
| } |
| } |
| |
| void ReversedIteratorForLoopInvalid(std::vector<int>& v){ |
| for(auto& i : Reversed(v)) { |
| if (i == 0) { |
| v.clear(); // TODO(329133423): This should emit a warning. |
| } |
| } |
| } |