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
13template<unsigned M, unsigned N>
14struct Ackermann {
15 enum {
16   value = Ackermann<M-1, Ackermann<M, N-1>::value >::value
17 };
18};
19
20template<unsigned M> struct Ackermann<M, 0> {
21 enum {
22   value = Ackermann<M-1, 1>::value
23 };
24};
25
26template<unsigned N> struct Ackermann<0, N> {
27 enum {
28   value = N + 1
29 };
30};
31
32template<> struct Ackermann<0, 0> {
33 enum {
34   value = 1
35 };
36};
37
38int g0[Ackermann<3, 4>::value == 125 ? 1 : -1];
39
40