15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier 
95a83710eSEric Fiselier // <vector>
105a83710eSEric Fiselier 
115a83710eSEric Fiselier // vector(const vector& v);
125a83710eSEric Fiselier 
135a83710eSEric Fiselier #include <vector>
145a83710eSEric Fiselier #include <cassert>
151f4231f8SEric Fiselier 
161f4231f8SEric Fiselier #include "test_macros.h"
175a83710eSEric Fiselier #include "test_allocator.h"
185a83710eSEric Fiselier #include "min_allocator.h"
195a83710eSEric Fiselier #include "asan_testing.h"
205a83710eSEric Fiselier 
215a83710eSEric Fiselier template <class C>
22*c74059c5SNikolas Klauser TEST_CONSTEXPR_CXX20 void
test(const C & x)235a83710eSEric Fiselier test(const C& x)
245a83710eSEric Fiselier {
25d4b83e6dSStephan T. Lavavej     typename C::size_type s = x.size();
265a83710eSEric Fiselier     C c(x);
271f4231f8SEric Fiselier     LIBCPP_ASSERT(c.__invariants());
285a83710eSEric Fiselier     assert(c.size() == s);
295a83710eSEric Fiselier     assert(c == x);
301f4231f8SEric Fiselier     LIBCPP_ASSERT(is_contiguous_container_asan_correct(c));
315a83710eSEric Fiselier }
325a83710eSEric Fiselier 
tests()33*c74059c5SNikolas Klauser TEST_CONSTEXPR_CXX20 bool tests() {
345a83710eSEric Fiselier     {
355a83710eSEric Fiselier         int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 7, 6, 5, 4, 3, 1, 0};
365a83710eSEric Fiselier         int* an = a + sizeof(a)/sizeof(a[0]);
375a83710eSEric Fiselier         test(std::vector<int>(a, an));
385a83710eSEric Fiselier     }
395a83710eSEric Fiselier     {
405a83710eSEric Fiselier         std::vector<int, test_allocator<int> > v(3, 2, test_allocator<int>(5));
415a83710eSEric Fiselier         std::vector<int, test_allocator<int> > v2 = v;
425a83710eSEric Fiselier         assert(is_contiguous_container_asan_correct(v));
435a83710eSEric Fiselier         assert(is_contiguous_container_asan_correct(v2));
445a83710eSEric Fiselier         assert(v2 == v);
455a83710eSEric Fiselier         assert(v2.get_allocator() == v.get_allocator());
465a83710eSEric Fiselier         assert(is_contiguous_container_asan_correct(v));
475a83710eSEric Fiselier         assert(is_contiguous_container_asan_correct(v2));
485a83710eSEric Fiselier     }
4982ff94a5SKonstantin Boyarinov     {
5082ff94a5SKonstantin Boyarinov         // Test copy ctor with empty source
5182ff94a5SKonstantin Boyarinov         std::vector<int, test_allocator<int> > v(test_allocator<int>(5));
5282ff94a5SKonstantin Boyarinov         std::vector<int, test_allocator<int> > v2 = v;
5382ff94a5SKonstantin Boyarinov         assert(is_contiguous_container_asan_correct(v));
5482ff94a5SKonstantin Boyarinov         assert(is_contiguous_container_asan_correct(v2));
5582ff94a5SKonstantin Boyarinov         assert(v2 == v);
5682ff94a5SKonstantin Boyarinov         assert(v2.get_allocator() == v.get_allocator());
5782ff94a5SKonstantin Boyarinov         assert(is_contiguous_container_asan_correct(v));
5882ff94a5SKonstantin Boyarinov         assert(is_contiguous_container_asan_correct(v2));
5982ff94a5SKonstantin Boyarinov         assert(v2.empty());
6082ff94a5SKonstantin Boyarinov     }
611f4231f8SEric Fiselier #if TEST_STD_VER >= 11
625a83710eSEric Fiselier     {
635a83710eSEric Fiselier         std::vector<int, other_allocator<int> > v(3, 2, other_allocator<int>(5));
645a83710eSEric Fiselier         std::vector<int, other_allocator<int> > v2 = v;
655a83710eSEric Fiselier         assert(is_contiguous_container_asan_correct(v));
665a83710eSEric Fiselier         assert(is_contiguous_container_asan_correct(v2));
675a83710eSEric Fiselier         assert(v2 == v);
685a83710eSEric Fiselier         assert(v2.get_allocator() == other_allocator<int>(-2));
695a83710eSEric Fiselier         assert(is_contiguous_container_asan_correct(v));
705a83710eSEric Fiselier         assert(is_contiguous_container_asan_correct(v2));
715a83710eSEric Fiselier     }
725a83710eSEric Fiselier     {
735a83710eSEric Fiselier         int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 7, 6, 5, 4, 3, 1, 0};
745a83710eSEric Fiselier         int* an = a + sizeof(a)/sizeof(a[0]);
755a83710eSEric Fiselier         test(std::vector<int, min_allocator<int>>(a, an));
765a83710eSEric Fiselier     }
775a83710eSEric Fiselier     {
785a83710eSEric Fiselier         std::vector<int, min_allocator<int> > v(3, 2, min_allocator<int>());
795a83710eSEric Fiselier         std::vector<int, min_allocator<int> > v2 = v;
805a83710eSEric Fiselier         assert(is_contiguous_container_asan_correct(v));
815a83710eSEric Fiselier         assert(is_contiguous_container_asan_correct(v2));
825a83710eSEric Fiselier         assert(v2 == v);
835a83710eSEric Fiselier         assert(v2.get_allocator() == v.get_allocator());
845a83710eSEric Fiselier         assert(is_contiguous_container_asan_correct(v));
855a83710eSEric Fiselier         assert(is_contiguous_container_asan_correct(v2));
865a83710eSEric Fiselier     }
875a83710eSEric Fiselier #endif
882df59c50SJF Bastien 
89*c74059c5SNikolas Klauser     return true;
90*c74059c5SNikolas Klauser }
91*c74059c5SNikolas Klauser 
main(int,char **)92*c74059c5SNikolas Klauser int main(int, char**)
93*c74059c5SNikolas Klauser {
94*c74059c5SNikolas Klauser     tests();
95*c74059c5SNikolas Klauser #if TEST_STD_VER > 17
96*c74059c5SNikolas Klauser     static_assert(tests());
97*c74059c5SNikolas Klauser #endif
982df59c50SJF Bastien     return 0;
995a83710eSEric Fiselier }
100