blob: 2ae56a50c8337964e19d2fbb83193a1fc5697f03 [file] [log] [blame]
#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.
}
}
}