Index: libcxx/include/vector =================================================================== --- libcxx/include/vector +++ libcxx/include/vector @@ -519,29 +519,14 @@ vector(size_type __n, const value_type& __x); vector(size_type __n, const value_type& __x, const allocator_type& __a); template - vector(_InputIterator __first, - typename enable_if<__is_cpp17_input_iterator <_InputIterator>::value && - !__is_cpp17_forward_iterator<_InputIterator>::value && - is_constructible< - value_type, - typename iterator_traits<_InputIterator>::reference>::value, - _InputIterator>::type __last); - template - vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a, + vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a = allocator_type(), typename enable_if<__is_cpp17_input_iterator <_InputIterator>::value && !__is_cpp17_forward_iterator<_InputIterator>::value && is_constructible< value_type, typename iterator_traits<_InputIterator>::reference>::value>::type* = 0); template - vector(_ForwardIterator __first, - typename enable_if<__is_cpp17_forward_iterator<_ForwardIterator>::value && - is_constructible< - value_type, - typename iterator_traits<_ForwardIterator>::reference>::value, - _ForwardIterator>::type __last); - template - vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a, + vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a = allocator_type(), typename enable_if<__is_cpp17_forward_iterator<_ForwardIterator>::value && is_constructible< value_type, @@ -1174,31 +1159,14 @@ } } -template -template -vector<_Tp, _Allocator>::vector(_InputIterator __first, - typename enable_if<__is_cpp17_input_iterator <_InputIterator>::value && - !__is_cpp17_forward_iterator<_InputIterator>::value && - is_constructible< - value_type, - typename iterator_traits<_InputIterator>::reference>::value, - _InputIterator>::type __last) -{ -#if _LIBCPP_DEBUG_LEVEL >= 2 - __get_db()->__insert_c(this); -#endif - for (; __first != __last; ++__first) - __emplace_back(*__first); -} - template template vector<_Tp, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a, - typename enable_if<__is_cpp17_input_iterator <_InputIterator>::value && - !__is_cpp17_forward_iterator<_InputIterator>::value && - is_constructible< - value_type, - typename iterator_traits<_InputIterator>::reference>::value>::type*) + typename enable_if<__is_cpp17_input_iterator <_InputIterator>::value && + !__is_cpp17_forward_iterator<_InputIterator>::value && + is_constructible< + value_type, + typename iterator_traits<_InputIterator>::reference>::value>::type*) : __base(__a) { #if _LIBCPP_DEBUG_LEVEL >= 2 @@ -1208,26 +1176,6 @@ __emplace_back(*__first); } -template -template -vector<_Tp, _Allocator>::vector(_ForwardIterator __first, - typename enable_if<__is_cpp17_forward_iterator<_ForwardIterator>::value && - is_constructible< - value_type, - typename iterator_traits<_ForwardIterator>::reference>::value, - _ForwardIterator>::type __last) -{ -#if _LIBCPP_DEBUG_LEVEL >= 2 - __get_db()->__insert_c(this); -#endif - size_type __n = static_cast(_VSTD::distance(__first, __last)); - if (__n > 0) - { - __vallocate(__n); - __construct_at_end(__first, __last, __n); - } -} - template template vector<_Tp, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a, Index: libcxx/test/std/containers/sequences/vector/vector.cons/construct_iter_iter_alloc.pass.cpp =================================================================== --- libcxx/test/std/containers/sequences/vector/vector.cons/construct_iter_iter_alloc.pass.cpp +++ libcxx/test/std/containers/sequences/vector/vector.cons/construct_iter_iter_alloc.pass.cpp @@ -25,6 +25,17 @@ #include "container_test_types.h" #endif +template +void test(Iterator first, Iterator last) { + C c(first, last); + LIBCPP_ASSERT(c.__invariants()); + assert(c.size() == static_cast(std::distance(first, last))); + LIBCPP_ASSERT(is_contiguous_container_asan_correct(c)); + for (typename C::const_iterator i = c.cbegin(), e = c.cend(); i != e; + ++i, ++first) + assert(*i == *first); +} + template void test(Iterator first, Iterator last, const A& a) { C c(first, last, a); @@ -82,6 +93,12 @@ random_access_iterator(an), alloc); test > >(a, an, alloc); test > >(a, an, nullptr); + test >({}, input_iterator{}); + test >(input_iterator{}, {}); + test >({}, forward_iterator{}); + test >(forward_iterator{}, {}); + + } #endif }