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

--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> ---
The "obvious" alternative impl using a lambda expression is even slower:

template<unsigned long N>
struct array
{
  int data[N];
};

template<unsigned long...> struct seq { };

#ifndef USE_LAMBDA
template<unsigned long... Idx>
array<sizeof...(Idx)>
to_array_impl(int (&a)[sizeof...(Idx)], seq<Idx...>)
{
  return {{a[Idx]...}};
}
#endif

template<unsigned long N>
array<N>
to_array(int (&a)[N])
{
#ifndef USE_LAMBDA
  return to_array_impl(a, seq<__integer_pack(N)...>{});
#else
  return [&a]<unsigned long... I>(seq<I...>) {
    return array<N>{{ a[I]... }};
  }(seq<__integer_pack(N)...>{});
#endif
}

constexpr int S = 2000;
int f[S];

array<S> g(void) { return to_array(f); }

Reply via email to