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