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

--- Comment #4 from Lukas Mosimann <lumosimann at gmail dot com> ---
Okay one last comment from my side (sorry for this two updates in short
intervals). I tried to further simplify it, and I came up with this code which
I think has the same problem.

```
template <typename T, T v>
struct integral_constant {
    static constexpr T value = v;
    using value_type = int; // remove this line
};

template <int X, int A>
struct F : integral_constant<int, F<X + (1 << A), A - 1>::value -
                                      F<X, A - 1>::value> {};

template <int X>
struct F<X, 0> : integral_constant<int, X> {};

int main() {
    F<0, 15>::value;
    return 0;
}
```

`integral_constant` with `value_type` compiles in 32 seconds on my machine.

`integral_constant` without `value_type` compiles in 1.6 seconds.

So we are talking about an 20x increase in compilation time. Things get worse
with larger N, e.g. `F<0, 16>`: 3.5 s vs. 167 s (48x increase).

Reply via email to