https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118340
Bug ID: 118340 Summary: fold expression is very slow to compile when used to initialize a variable Product: gcc Version: 14.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: jonathan.poelen at gmail dot com Target Milestone: --- The following code works perfectly, but depending on where the unfolding is used, the compilation goes from 60 milliseconds to 2 seconds, which is abnormal. A sequence of 5000 values is used to show the slowdown. Tools like `time` show a big difference with a few hundred values. #include <utility> #include <type_traits> template<std::size_t... i> static constexpr std::size_t v1 = (i + ...); // slow template<std::size_t... i> static constexpr std::size_t v2 = std::integral_constant<std::size_t, (i + ...)>::value; // fast template<std::size_t... i> static constexpr std::size_t v3 = sizeof(char[(i + ...)]); // fast template<std::size_t... i> constexpr int foo(std::index_sequence<i...>) { return v1<i...>; // slow 2 seconds // return v2<i...>; // instant // return v3<i...>; // instant // return (... + i); // slow 2 seconds // return std::integral_constant<std::size_t, (i + ...)>::value; // slow 2 seconds // return sizeof(char[(i + ...)]); // instant } int main() { static_assert(12497500 == foo(std::make_index_sequence<5000>{})); }