xref: /aosp_15_r20/external/clang/test/SemaTemplate/instantiation-depth-defarg.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -ftemplate-depth 128 -ftemplate-backtrace-limit 4 %s
2*67e74705SXin Li 
3*67e74705SXin Li template<int N> struct S {
4*67e74705SXin Li   typedef typename S<N-1>::type type;
5*67e74705SXin Li   static int f(int n = S<N-1>::f()); // \
6*67e74705SXin Li // expected-error{{recursive template instantiation exceeded maximum depth of 128}} \
7*67e74705SXin Li // expected-note 3 {{instantiation of default function argument}} \
8*67e74705SXin Li // expected-note {{skipping 125 contexts in backtrace}} \
9*67e74705SXin Li // expected-note {{use -ftemplate-depth=N to increase recursive template instantiation depth}}
10*67e74705SXin Li 
11*67e74705SXin Li };
12*67e74705SXin Li template<> struct S<0> {
13*67e74705SXin Li   typedef int type;
14*67e74705SXin Li };
15*67e74705SXin Li 
16*67e74705SXin Li // Incrementally instantiate up to S<2048>.
17*67e74705SXin Li template struct S<128>;
18*67e74705SXin Li template struct S<256>;
19*67e74705SXin Li template struct S<384>;
20*67e74705SXin Li template struct S<512>;
21*67e74705SXin Li template struct S<640>;
22*67e74705SXin Li template struct S<768>;
23*67e74705SXin Li template struct S<896>;
24*67e74705SXin Li template struct S<1024>;
25*67e74705SXin Li template struct S<1152>;
26*67e74705SXin Li template struct S<1280>;
27*67e74705SXin Li template struct S<1408>;
28*67e74705SXin Li template struct S<1536>;
29*67e74705SXin Li template struct S<1664>;
30*67e74705SXin Li template struct S<1792>;
31*67e74705SXin Li template struct S<1920>;
32*67e74705SXin Li template struct S<2048>;
33*67e74705SXin Li 
34*67e74705SXin Li // Check that we actually bail out when we hit the instantiation depth limit for
35*67e74705SXin Li // the default arguments.
g()36*67e74705SXin Li void g() { S<2048>::f(); } // expected-note {{required here}}
37