1 // RUN: %clang_cc1 -fsyntax-only -verify %s
2 // expected-no-diagnostics
3 
4 // template<unsigned M, unsigned N>
5 // struct Ackermann {
6 //   enum {
7 //     value = M ? (N ? Ackermann<M-1, Ackermann<M, N-1> >::value
8 //                    : Ackermann<M-1, 1>::value)
9 //               : N + 1
10 //   };
11 // };
12 
13 template<unsigned M, unsigned N>
14 struct Ackermann {
15  enum {
16    value = Ackermann<M-1, Ackermann<M, N-1>::value >::value
17  };
18 };
19 
20 template<unsigned M> struct Ackermann<M, 0> {
21  enum {
22    value = Ackermann<M-1, 1>::value
23  };
24 };
25 
26 template<unsigned N> struct Ackermann<0, N> {
27  enum {
28    value = N + 1
29  };
30 };
31 
32 template<> struct Ackermann<0, 0> {
33  enum {
34    value = 1
35  };
36 };
37 
38 int g0[Ackermann<3, 4>::value == 125 ? 1 : -1];
39 
40