| // PR c++/86969 | |
| // { dg-do compile { target c++17 } } | |
| auto compose = [](auto... fs) { | |
| if constexpr (sizeof...(fs) == 0) { | |
| return [](auto x) { return x; }; | |
| } else { | |
| auto fn = [](auto self, auto f, auto... fs) { | |
| if constexpr (sizeof...(fs) == 0) return f; | |
| else return [=](auto x) { | |
| return f(self(self, fs...)(x)); | |
| }; | |
| }; | |
| return fn(fn, fs...); | |
| } | |
| }; | |
| static_assert(compose( | |
| [](auto x) { return x * 3; }, | |
| [](auto x) { return x + 1; }, | |
| [](auto x) { return x / 2; } | |
| )(6) == 12); |