Index: include/vector =================================================================== --- include/vector +++ include/vector @@ -519,12 +519,13 @@ vector(size_type __n, const_reference __x); vector(size_type __n, const_reference __x, const allocator_type& __a); template - vector(_InputIterator __first, _InputIterator __last, + vector(_InputIterator __first, typename enable_if<__is_input_iterator <_InputIterator>::value && !__is_forward_iterator<_InputIterator>::value && is_constructible< value_type, - typename iterator_traits<_InputIterator>::reference>::value>::type* = 0); + typename iterator_traits<_InputIterator>::reference>::value, + _InputIterator>::type __last); template vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a, typename enable_if<__is_input_iterator <_InputIterator>::value && @@ -533,11 +534,12 @@ value_type, typename iterator_traits<_InputIterator>::reference>::value>::type* = 0); template - vector(_ForwardIterator __first, _ForwardIterator __last, + vector(_ForwardIterator __first, typename enable_if<__is_forward_iterator<_ForwardIterator>::value && is_constructible< value_type, - typename iterator_traits<_ForwardIterator>::reference>::value>::type* = 0); + typename iterator_traits<_ForwardIterator>::reference>::value, + _ForwardIterator>::type __last); template vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a, typename enable_if<__is_forward_iterator<_ForwardIterator>::value && @@ -1051,12 +1053,13 @@ template template -vector<_Tp, _Allocator>::vector(_InputIterator __first, _InputIterator __last, +vector<_Tp, _Allocator>::vector(_InputIterator __first, typename enable_if<__is_input_iterator <_InputIterator>::value && !__is_forward_iterator<_InputIterator>::value && is_constructible< value_type, - typename iterator_traits<_InputIterator>::reference>::value>::type*) + typename iterator_traits<_InputIterator>::reference>::value, + _InputIterator>::type __last) { #if _LIBCPP_DEBUG_LEVEL >= 2 __get_db()->__insert_c(this); @@ -1084,11 +1087,12 @@ template template -vector<_Tp, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, +vector<_Tp, _Allocator>::vector(_ForwardIterator __first, typename enable_if<__is_forward_iterator<_ForwardIterator>::value && is_constructible< value_type, - typename iterator_traits<_ForwardIterator>::reference>::value>::type*) + typename iterator_traits<_ForwardIterator>::reference>::value, + _ForwardIterator>::type __last) { #if _LIBCPP_DEBUG_LEVEL >= 2 __get_db()->__insert_c(this); Index: test/containers/sequences/vector/vector.cons/construct_iter_iter_alloc.pass.cpp =================================================================== --- test/containers/sequences/vector/vector.cons/construct_iter_iter_alloc.pass.cpp +++ test/containers/sequences/vector/vector.cons/construct_iter_iter_alloc.pass.cpp @@ -19,9 +19,9 @@ #include "../../../stack_allocator.h" #include "../../../min_allocator.h" -template +template void -test(Iterator first, Iterator last, const typename C::allocator_type& a) +test(Iterator first, Iterator last, const A& a) { C c(first, last, a); assert(c.__invariants()); @@ -30,6 +30,13 @@ assert(*i == *first); } +template +struct implicit_conv_allocator : min_allocator +{ + implicit_conv_allocator(void* p) {} + implicit_conv_allocator(const implicit_conv_allocator&) = default; +}; + int main() { { @@ -52,6 +59,7 @@ test> >(bidirectional_iterator(a), bidirectional_iterator(an), alloc); test> >(random_access_iterator(a), random_access_iterator(an), alloc); test> >(a, an, alloc); + test> >(a, an, nullptr); } #endif }