Boost logo

Boost :

From: Rainer Deyke (rdeyke_at_[hidden])
Date: 2023-08-05 12:11:56


On 03.08.23 16:33, Marshall Clow via Boost wrote:
> As always, the release managers would appreciate it if you download the
> candidate of your choice and give building it a try. Please report both
> success and failure, and anything else that is noteworthy.
>
> -- The Release managers

Sorry for the very late report, but I think I found a serious regression
in either Boost.Stl_interfaces or in Boost.Range. Some iterators
generated by Boost.Stl_interfaces are not accepted by Boost.Range. This
is a regression from Boost 1.82. Minimal example program, with
basic_input_iter taken directly from a Boost.Stl_interfaces test:

#include "boost/stl_interfaces/iterator_interface.hpp"
#include "boost/range/iterator_range.hpp"

struct basic_input_iter
     : boost::stl_interfaces::iterator_interface<
#if !BOOST_STL_INTERFACES_USE_DEDUCED_THIS
           basic_input_iter,
#endif
           std::input_iterator_tag, int>
{
     basic_input_iter() : it_(nullptr) {}
     basic_input_iter(int * it) : it_(it) {}

     int & operator*() const noexcept { return *it_; }
     basic_input_iter & operator++() noexcept
     {
         ++it_;
         return *this;
     }
     friend bool operator==(basic_input_iter lhs, basic_input_iter rhs)
noexcept
     {
         return lhs.it_ == rhs.it_;
     }

     using base_type = boost::stl_interfaces::iterator_interface<
#if !BOOST_STL_INTERFACES_USE_DEDUCED_THIS
         basic_input_iter,
#endif
         std::input_iterator_tag, int>;
     using base_type::operator++;

private:
     int * it_;
};

auto make_range() {
   static int si;
   return boost::make_iterator_range(
       basic_input_iter(&si),
       basic_input_iter(&si + 1));
}

This fails to compile with the following errors:

>g++ -Wall -Wstrict-aliasing=0 -Wno-unused-local-typedefs
-Werror=return-type -static-libgcc -static-libasan -static-libstdc++
-static-libubsan -std=gnu++20 -O3 -flto -pthread
-Iintermediate/linux64/obj/linux64__test__iter_test
-Iintermediate/linux64/libs/boost/install/include
-DELDWOOD_EXTENSION_BOOST -c -o
intermediate/linux64/obj/linux64__test__iter_test/eldwood/test/iter.cpp.o
intermediate/linux64/obj/linux64__test__iter_test/eldwood/test/iter.cpp
In file included from
intermediate/linux64/libs/boost/install/include/boost/iterator/iterator_facade.hpp:13,
                  from
intermediate/linux64/libs/boost/install/include/boost/range/iterator_range_core.hpp:27,
                  from
intermediate/linux64/libs/boost/install/include/boost/range/iterator_range.hpp:13,
                  from
intermediate/linux64/obj/linux64__test__iter_test/eldwood/test/iter.cpp:2:
intermediate/linux64/libs/boost/install/include/boost/iterator/iterator_categories.hpp:
In instantiation of ‘struct
boost::iterators::iterator_traversal<basic_input_iter>’:
intermediate/linux64/libs/boost/install/include/boost/range/iterator_range_core.hpp:158:5:
   required from ‘struct
boost::iterator_range_detail::pure_iterator_traversal<basic_input_iter>’
intermediate/linux64/libs/boost/install/include/boost/range/iterator_range_core.hpp:434:15:
   required from ‘class boost::iterator_range<basic_input_iter>’
intermediate/linux64/obj/linux64__test__iter_test/eldwood/test/iter.cpp:40:36:
   required from here
intermediate/linux64/libs/boost/install/include/boost/iterator/iterator_categories.hpp:118:8:
error: no type named ‘iterator_category’ in ‘struct
std::iterator_traits<basic_input_iter>’
   118 | struct iterator_traversal
       | ^~~~~~~~~~~~~~~~~~
intermediate/linux64/libs/boost/install/include/boost/range/iterator_range_core.hpp:
In instantiation of ‘struct
boost::iterator_range_detail::pure_iterator_traversal<basic_input_iter>’:
intermediate/linux64/libs/boost/install/include/boost/range/iterator_range_core.hpp:434:15:
   required from ‘class boost::iterator_range<basic_input_iter>’
intermediate/linux64/obj/linux64__test__iter_test/eldwood/test/iter.cpp:40:36:
   required from here
intermediate/linux64/libs/boost/install/include/boost/range/iterator_range_core.hpp:158:5:
error: no type named ‘type’ in ‘struct
boost::iterators::iterator_traversal<basic_input_iter>’
   158 | traversal_t;
       | ^~~~~~~~~~~
In file included from
intermediate/linux64/libs/boost/install/include/boost/utility/enable_if.hpp:15,
                  from
intermediate/linux64/libs/boost/install/include/boost/range/has_range_iterator.hpp:21,
                  from
intermediate/linux64/libs/boost/install/include/boost/range/difference_type.hpp:21,
                  from
intermediate/linux64/libs/boost/install/include/boost/range/size_type.hpp:19,
                  from
intermediate/linux64/libs/boost/install/include/boost/range/size.hpp:21,
                  from
intermediate/linux64/libs/boost/install/include/boost/range/functions.hpp:20,
                  from
intermediate/linux64/libs/boost/install/include/boost/range/iterator_range_core.hpp:38:
intermediate/linux64/libs/boost/install/include/boost/core/enable_if.hpp:
In instantiation of ‘struct
boost::enable_if<boost::iterator_range<basic_input_iter>::is_compatible_range<const
basic_input_iter>, void>’:
intermediate/linux64/libs/boost/install/include/boost/range/iterator_range_core.hpp:489:13:
   required by substitution of ‘template<class SinglePassRange>
boost::iterator_range<basic_input_iter>::iterator_range(const
SinglePassRange&, typename boost::enable_if<is_compatible_range<const
SinglePassRange>, void>::type*) [with SinglePassRange = basic_input_iter]’
intermediate/linux64/libs/boost/install/include/boost/range/iterator_range_core.hpp:758:20:
   required from ‘boost::iterator_range<IteratorT>
boost::make_iterator_range(IteratorT, IteratorT) [with IteratorT =
basic_input_iter]’
intermediate/linux64/obj/linux64__test__iter_test/eldwood/test/iter.cpp:40:36:
   required from here
intermediate/linux64/libs/boost/install/include/boost/core/enable_if.hpp:41:10:
error: ‘value’ is not a member of
‘boost::iterator_range<basic_input_iter>::is_compatible_range<const
basic_input_iter>’
    41 | struct enable_if : public enable_if_c<Cond::value, T> {};
       | ^~~~~~~~~
intermediate/linux64/libs/boost/install/include/boost/core/enable_if.hpp:
In instantiation of ‘struct
boost::enable_if<boost::iterator_range<basic_input_iter>::is_compatible_range<basic_input_iter>,
void>’:
intermediate/linux64/libs/boost/install/include/boost/range/iterator_range_core.hpp:500:13:
   required by substitution of ‘template<class SinglePassRange>
boost::iterator_range<basic_input_iter>::iterator_range(SinglePassRange&,
typename boost::enable_if<is_compatible_range<Source>, void>::type*)
[with SinglePassRange = basic_input_iter]’
intermediate/linux64/libs/boost/install/include/boost/range/iterator_range_core.hpp:758:20:
   required from ‘boost::iterator_range<IteratorT>
boost::make_iterator_range(IteratorT, IteratorT) [with IteratorT =
basic_input_iter]’
intermediate/linux64/obj/linux64__test__iter_test/eldwood/test/iter.cpp:40:36:
   required from here
intermediate/linux64/libs/boost/install/include/boost/core/enable_if.hpp:41:10:
error: ‘value’ is not a member of
‘boost::iterator_range<basic_input_iter>::is_compatible_range<basic_input_iter>’

Build failed.

-- 
Rainer Deyke (rainerd_at_[hidden])

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk