chromium/tools/clang/iterator_checker/tests/simple-insert.cpp

// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <algorithm>
#include <vector>

void UseReturnedIteratorAfterInsert(std::vector<int>& v) {
  auto it = std::begin(v);

  it = v.insert(it, 10);

  // Fine comparison because we are using the returned iterator
  if (it != std::end(v)) {
    // Valid because it was checked against `end`.
    *it;
  }
}

void UseInvalidIteratorAfterInsert(std::vector<int>& v) {
  auto it = std::begin(v);

  v.insert(it, 10);

  // Wrong comparison because we are using the invalidated iterator
  if (it != std::end(v)) {
    // Valid because it was checked against `end`.
    *it;
  }
}

void InsertRangeMismatchedIterators(std::vector<int>& v1,
                                    std::vector<int>& v2) {
  auto it = std::begin(v1);

  // This is not fine because using mismatched iterators.
  v1.insert(it, v2.begin(), v1.end());
}

void InsertRange(std::vector<int>& v1, std::vector<int>& v2) {
  auto it = std::begin(v1);

  v1.insert(it, v2.begin(), v2.end());
}