1 | // RUN: %clang_cc1 %s -emit-llvm-only -o - |
2 | |
3 | // https://bugs.llvm.org/show_bug.cgi?id=38356 |
4 | // We only check that we do not crash. |
5 | |
6 | // ASAN increases stack usage, so we are hitting stack overflow before reaching |
7 | // recursive template instantiation limit. |
8 | // XFAIL: darwin && asan |
9 | |
10 | template <typename a, a b(unsigned), int c, unsigned...> |
11 | struct d : d<a, b, c - 1> {}; |
12 | template <typename a, a b(unsigned), unsigned... e> |
13 | struct d<a, b, 0, e...> { |
14 | a f[0]; |
15 | }; |
16 | struct g { |
17 | static g h(unsigned); |
18 | }; |
19 | struct i { |
20 | void j() const; |
21 | // Current maximum depth of recursive template instantiation is 1024, |
22 | // thus, this \/ threshold value is used here. BasePathSize in CastExpr might |
23 | // not fit it, so we are testing that we do fit it. |
24 | // If -ftemplate-depth= is provided, larger values (4096 and up) cause crashes |
25 | // elsewhere. |
26 | d<g, g::h, (1U << 10U) - 2U> f; |
27 | }; |
28 | void i::j() const { |
29 | const void *k{f.f}; |
30 | (void)k; |
31 | } |
32 | |