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

Reply via email to