http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58191
Bug ID: 58191 Summary: Can't use boost transform_iterator with _GLIBCXX_DEBUG Product: gcc Version: 4.8.1 Status: UNCONFIRMED Severity: major Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: woodroof at gmail dot com Given: A simple code: int calc_value(int original_value) { return original_value % 3; } int main() { std::vector<int> numbers; std::upper_bound( boost::make_transform_iterator(numbers.begin(), calc_value), boost::make_transform_iterator(numbers.end(), calc_value), 1); } Gcc version: g++ (Ubuntu 4.8.1-2ubuntu1~13.04) 4.8.1 Additional command line params: -D_GLIBCXX_DEBUG Result: Compilation error In file included from /usr/include/c++/4.8/debug/debug.h:127:0, from /usr/include/c++/4.8/bits/stl_iterator_base_funcs.h:65, from /usr/include/c++/4.8/bits/stl_algobase.h:66, from /usr/include/c++/4.8/vector:60, from 1.cpp:1: /usr/include/c++/4.8/debug/functions.h: In instantiation of ‘bool __gnu_debug::__check_partitioned_upper(_ForwardIterator, _ForwardIterator, const _Tp&) [with _ForwardIterator = boost::transform_iterator<int (*)(int), __gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<int*, std::__cxx1998::vector<int, std::allocator<int> > >, std::__debug::vector<int> >, boost::use_default, boost::use_default>; _Tp = int]’: /usr/include/c++/4.8/bits/stl_algo.h:2506:358: required from ‘_FIter std::upper_bound(_FIter, _FIter, const _Tp&) [with _FIter = boost::transform_iterator<int (*)(int), __gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<int*, std::__cxx1998::vector<int, std::allocator<int> > >, std::__debug::vector<int> >, boost::use_default, boost::use_default>; _Tp = int]’ 1.cpp:16:4: required from here /usr/include/c++/4.8/debug/functions.h:428:42: error: no matching function for call to ‘__check_partitioned_upper_aux(boost::transform_iterator<int (*)(int), __gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<int*, std::__cxx1998::vector<int, std::allocator<int> > >, std::__debug::vector<int> >, boost::use_default, boost::use_default>&, boost::transform_iterator<int (*)(int), __gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<int*, std::__cxx1998::vector<int, std::allocator<int> > >, std::__debug::vector<int> >, boost::use_default, boost::use_default>&, const int&, std::iterator_traits<boost::transform_iterator<int (*)(int), __gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<int*, std::__cxx1998::vector<int, std::allocator<int> > >, std::__debug::vector<int> >, boost::use_default, boost::use_default> >::iterator_category)’ std::__iterator_category(__first)); ^ /usr/include/c++/4.8/debug/functions.h:428:42: note: candidates are: /usr/include/c++/4.8/debug/functions.h:393:5: note: template<class _ForwardIterator, class _Tp> bool __gnu_debug::__check_partitioned_upper_aux(_ForwardIterator, _ForwardIterator, const _Tp&, std::forward_iterator_tag) __check_partitioned_upper_aux(_ForwardIterator __first, ^ /usr/include/c++/4.8/debug/functions.h:393:5: note: template argument deduction/substitution failed: /usr/include/c++/4.8/debug/functions.h:428:42: note: cannot convert ‘std::__iterator_category<boost::transform_iterator<int (*)(int), __gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<int*, std::__cxx1998::vector<int, std::allocator<int> > >, std::__debug::vector<int> >, boost::use_default, boost::use_default> >((*(const boost::transform_iterator<int (*)(int), __gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<int*, std::__cxx1998::vector<int, std::allocator<int> > >, std::__debug::vector<int> >, boost::use_default, boost::use_default>*)(& __first)))’ (type ‘std::iterator_traits<boost::transform_iterator<int (*)(int), __gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<int*, std::__cxx1998::vector<int, std::allocator<int> > >, std::__debug::vector<int> >, boost::use_default, boost::use_default> >::iterator_category {aka boost::detail::iterator_category_with_traversal<std::input_iterator_tag, boost::random_access_traversal_tag>}’) to type ‘std::forward_iterator_tag’ std::__iterator_category(__first)); ^ /usr/include/c++/4.8/debug/functions.h:412:5: note: template<class _Iterator, class _Sequence, class _Tp> bool __gnu_debug::__check_partitioned_upper_aux(const __gnu_debug::_Safe_iterator<_Iterator, _Sequence>&, const __gnu_debug::_Safe_iterator<_Iterator, _Sequence>&, const _Tp&, std::random_access_iterator_tag) __check_partitioned_upper_aux( ^ /usr/include/c++/4.8/debug/functions.h:412:5: note: template argument deduction/substitution failed: /usr/include/c++/4.8/debug/functions.h:428:42: note: ‘boost::transform_iterator<int (*)(int), __gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<int*, std::__cxx1998::vector<int, std::allocator<int> > >, std::__debug::vector<int> >, boost::use_default, boost::use_default>’ is not derived from ‘const __gnu_debug::_Safe_iterator<_Iterator, _Sequence>’ std::__iterator_category(__first)); ^ /usr/include/c++/4.8/debug/functions.h:498:5: note: template<class _Iterator, class _Sequence, class _Tp, class _Pred> bool __gnu_debug::__check_partitioned_upper_aux(const __gnu_debug::_Safe_iterator<_Iterator, _Sequence>&, const __gnu_debug::_Safe_iterator<_Iterator, _Sequence>&, const _Tp&, _Pred, std::random_access_iterator_tag) __check_partitioned_upper_aux( ^ /usr/include/c++/4.8/debug/functions.h:498:5: note: template argument deduction/substitution failed: /usr/include/c++/4.8/debug/functions.h:428:42: note: ‘boost::transform_iterator<int (*)(int), __gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<int*, std::__cxx1998::vector<int, std::allocator<int> > >, std::__debug::vector<int> >, boost::use_default, boost::use_default>’ is not derived from ‘const __gnu_debug::_Safe_iterator<_Iterator, _Sequence>’ std::__iterator_category(__first)); ^ /usr/include/c++/4.8/debug/functions.h:477:5: note: template<class _ForwardIterator, class _Tp, class _Pred> bool __gnu_debug::__check_partitioned_upper_aux(_ForwardIterator, _ForwardIterator, const _Tp&, _Pred, std::forward_iterator_tag) __check_partitioned_upper_aux(_ForwardIterator __first, ^ /usr/include/c++/4.8/debug/functions.h:477:5: note: template argument deduction/substitution failed: /usr/include/c++/4.8/debug/functions.h:428:42: note: candidate expects 5 arguments, 4 provided std::__iterator_category(__first)); ^ gcc 4.7.3 works fine