//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: c++03
// <vector>
#include <cstddef>
#include <memory>
#include <vector>
#include "test_macros.h"
struct Incomplete;
template<class T> struct Holder { T t; };
template<class T, class AdlTrap = Holder<Incomplete>>
struct MyAlloc {
using value_type = T;
MyAlloc() = default;
template<class U> MyAlloc(const MyAlloc<U>&) {}
T *allocate(std::size_t n) { return std::allocator<T>().allocate(n); }
void deallocate(T *p, std::size_t n) { return std::allocator<T>().deallocate(p, n); }
};
int main(int, char**)
{
std::vector<bool, MyAlloc<bool>> vb;
// std::fill_n triggers ADL because __bit_iterator has the container type as a template argument
// std::vector<bool, MyAlloc<bool>> wb(100);
std::vector<int, MyAlloc<int>> v;
std::vector<int, MyAlloc<int>> w(100);
v.push_back(1);
v.insert(v.end(), 2);
v.insert(v.end(), w.begin(), w.end());
v.pop_back();
v.erase(v.begin());
v.erase(v.begin(), v.end());
#if TEST_STD_VER >= 14
// TODO: vector::swap is not robust against ADL because we compare allocators, and that
// triggers ADL when looking up operator==.
// v.swap(w);
#endif
return 0;
}