https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116473

            Bug ID: 116473
           Summary: std::ranges::to vs constexpr
           Product: gcc
           Version: 14.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: terra at gnome dot org
  Target Milestone: ---

Created attachment 58987
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=58987&action=edit
Preprocessed source code

I *think* the following ought to work with the "constexpr".  It works fine
without and in that case generates code with 3 run-time calls to operator new
and operator delete each.


# cat ttt-ranges-to.C

#include <ranges>
#include <vector>

int
oink(void)
{
    constexpr auto v = std::views::iota(1,5) |
std::ranges::to<std::vector<int>>();
    return v.front();
}


# /usr/local/products/gcc/14.1.0/bin/g++ -std=c++23 -c ttt-ranges-to.C
In file included from
/usr/local/products/gcc/14.1.0/include/c++/14.1.0/string:43,
                 from
/usr/local/products/gcc/14.1.0/include/c++/14.1.0/bits/locale_classes.h:40,
                 from
/usr/local/products/gcc/14.1.0/include/c++/14.1.0/bits/ios_base.h:41,
                 from
/usr/local/products/gcc/14.1.0/include/c++/14.1.0/streambuf:43,
                 from
/usr/local/products/gcc/14.1.0/include/c++/14.1.0/bits/streambuf_iterator.h:35,
                 from
/usr/local/products/gcc/14.1.0/include/c++/14.1.0/iterator:66,
                 from
/usr/local/products/gcc/14.1.0/include/c++/14.1.0/ranges:43,
                 from ttt-ranges-to.C:1:
/usr/local/products/gcc/14.1.0/include/c++/14.1.0/bits/allocator.h: In function
‘int oink()’:
/usr/local/products/gcc/14.1.0/include/c++/14.1.0/bits/allocator.h:193:52:
error: ‘std::ranges::views::__adaptor::operator|(_Range&&, _Self&&) [with _Self
= _Partial<std::ranges::__detail::_To<std::vector<int> > >; _Range =
std::ranges::iota_view<int, int>](std::ranges::to<std::vector<int> >())’ is not
a constant expression because it refers to a result of ‘operator new’
  193 |             return static_cast<_Tp*>(::operator new(__n));
      |                                      ~~~~~~~~~~~~~~^~~~~

Reply via email to