boost.gil build failed with GCC11 and -std=c++20

Qiang Ren via Boost-users <[email protected]>
Newsgroups gmane.comp.lib.boost.user
Message-ID <DM6PR18MB2780A6F83636F35C0B5FC8DA844D9@DM6PR18MB2780.namprd18.prod.outlook.com>
Hi,

I am on ubuntu 20.04, I have GCC9.4 and 10.3 and 11.1 installed.

I found that when set "-std=c++20", with gcc11, boost.gil will failed to build.

Here is the simple test cpp to reproduce the issue:

#include <sstream>
#include <boost/gil.hpp>
#include <boost/gil/extension/io/png.hpp>

namespace gil = boost::gil;

int main()
{
  gil::rgb8_image_t img;
  std::stringstream buf(std::ios::in | std::ios::out | std::ios::binary);
  gil::read_and_convert_image(buf, img, gil::png_tag{});

  return 0;
}

the build command is:
g++ -o test test_gcc11_gil.cc -std=c++20 -I${THIRD_PARTY}/boost/boost_1_78_0 -L${THIRD_PARTY}/libpng/1.6.37/lib/ -lpng

If replaced '-std=c++20' with '-std=c++17', the build would be OK,  but with 'c++20', gcc 11 failed with the following errors:

In file included from /data/lin/ThirdParty/boost/boost_1_78_0/boost/gil/extension/io/png/read.hpp:13,
from /data/lin/ThirdParty/boost/boost_1_78_0/boost/gil/extension/io/png.hpp:11,
from test_gcc11_gil.cc:3:
/data/lin/ThirdParty/boost/boost_1_78_0/boost/gil/extension/io/png/tags.hpp:576:32: error: expected unqualified-id before ‘)’ token
576 |     image_read_info< png_tag >()
|                                ^
/data/lin/ThirdParty/boost/boost_1_78_0/boost/gil/extension/io/png/tags.hpp:711:36: error: expected unqualified-id before ‘)’ token
711 |     image_read_settings< png_tag >()
|                                    ^
In file included from /data/lin/ThirdParty/boost/boost_1_78_0/boost/gil/extension/io/png/read.hpp:21,
from /data/lin/ThirdParty/boost/boost_1_78_0/boost/gil/extension/io/png.hpp:11,
from test_gcc11_gil.cc:3:
/data/lin/ThirdParty/boost/boost_1_78_0/boost/gil/io/make_reader.hpp: In instantiation of ‘typename boost::gil::get_reader<String, FormatTag, ConversionPolicy>::type boost::gil::make_reader(Device&, const FormatTag&, const ConversionPolicy&, typename std::enable_if<typename boost::mp11::detail::mp_and_impl<boost::mp11::mp_list<boost::gil::detail::is_adaptable_input_device<FormatTag, Device, void>, boost::gil::is_format_tag<FormatTag> >, void>::type::value>::type*) [with Device = std::__cxx11::basic_stringstream<char>; FormatTag = boost::gil::png_tag; ConversionPolicy = boost::gil::detail::read_and_convert<boost::gil::default_color_converter>; typename boost::gil::get_reader<String, FormatTag, ConversionPolicy>::type = boost::gil::reader<boost::gil::detail::istream_device<boost::gil::png_tag>, boost::gil::png_tag, boost::gil::detail::read_and_convert<boost::gil::default_color_converter> >; typename std::enable_if<typename boost::mp11::detail::mp_and_impl<boost::mp11::mp_list<boost::gil::detail::is_adaptable_input_device<FormatTag, Device, void>, boost::gil::is_format_tag<FormatTag> >, void>::type::value>::type = void;typename boost::mp11::detail::mp_and_impl<boost::mp11::mp_list<boost::gil::detail::is_adaptable_input_device<FormatTag, Device, void>, boost::gil::is_format_tag<FormatTag> >, void>::type =std::integral_constant<bool, true>]’:
/data/lin/ThirdParty/boost/boost_1_78_0/boost/gil/io/read_and_convert_image.hpp:263:34:   required from ‘void boost::gil::read_and_convert_image(Device&, Image&, const FormatTag&, typename std::enable_if<typename boost::mp11::detail::mp_and_impl<boost::mp11::mp_list<boost::gil::detail::is_read_device<FormatTag, Device, void>, boost::gil::is_format_tag<FormatTag> >, void>::type::value>::type*) [with Device = std::__cxx11::basic_stringstream<char>; Image = boost::gil::image<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mp11::mp_list<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t> > >, false, std::allocator<unsigned char> >; FormatTag = boost::gil::png_tag; typename std::enable_if<typename boost::mp11::detail::mp_and_impl<boost::mp11::mp_list<boost::gil::detail::is_read_device<FormatTag, Device, void>, boost::gil::is_format_tag<FormatTag> >, void>::type::value>::type = void; typename boost::mp11::detail::mp_and_impl<boost::mp11::mp_list<boost::gil::detail::is_read_device<FormatTag, Device, void>, boost::gil::is_format_tag<FormatTag> >, void>::type = std::integral_constant<bool, true>]’
test_gcc11_gil.cc:11:30:   required from here
/data/lin/ThirdParty/boost/boost_1_78_0/boost/gil/io/make_reader.hpp:193:30: error: no matching function for call to ‘boost::gil::image_read_settings<boost::gil::png_tag>::image_read_settings()’
193 |     return make_reader(file, image_read_settings<FormatTag>(), cc);
|                              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /data/lin/ThirdParty/boost/boost_1_78_0/boost/gil/extension/io/png/read.hpp:13,
from /data/lin/ThirdParty/boost/boost_1_78_0/boost/gil/extension/io/png.hpp:11,
from test_gcc11_gil.cc:3:
/data/lin/ThirdParty/boost/boost_1_78_0/boost/gil/extension/io/png/tags.hpp:718:5: note: candidate: ‘boost::gil::image_read_settings<boost::gil::png_tag>::image_read_settings(const point_t&, const point_t&)’
718 |     image_read_settings( const point_t& top_left
|     ^~~~~~~~~~~~~~~~~~~
/data/lin/ThirdParty/boost/boost_1_78_0/boost/gil/extension/io/png/tags.hpp:718:5: note:   candidate expects 2 arguments, 0 provided
/data/lin/ThirdParty/boost/boost_1_78_0/boost/gil/extension/io/png/tags.hpp:707:8: note: candidate: ‘constexpr boost::gil::image_read_settings<boost::gil::png_tag>::image_read_settings(const boost::gil::image_read_settings<boost::gil::png_tag>&)’
707 | struct image_read_settings< png_tag > : public image_read_settings_base
|        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/data/lin/ThirdParty/boost/boost_1_78_0/boost/gil/extension/io/png/tags.hpp:707:8: note:   candidate expects 1 argument, 0 provided
/data/lin/ThirdParty/boost/boost_1_78_0/boost/gil/extension/io/png/tags.hpp:707:8: note: candidate: ‘constexpr boost::gil::image_read_settings<boost::gil::png_tag>::image_read_settings(boost::gil::image_read_settings<boost::gil::png_tag>&&)’
/data/lin/ThirdParty/boost/boost_1_78_0/boost/gil/extension/io/png/tags.hpp:707:8: note:   candidate expects 1 argument, 0 provided


Only gcc 11 will fail with '-std=c++20', gcc9 and gcc 10 worked fine. I guess that gcc11 has implemented more c++20 features than gcc9 and gcc10.
Since the boost project updates more quickly than gcc, I hope this issue might be fixed in the next boost version.


Thanks,
Qiang Ren

_______________________________________________
Boost-users mailing list
[email protected]
https://lists.boost.org/mailman/listinfo.cgi/boost-users
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.