|  | // RUN: %clang_cc1 -fsyntax-only -verify %s | 
|  | // expected-no-diagnostics | 
|  |  | 
|  | // template<unsigned M, unsigned N> | 
|  | // struct Ackermann { | 
|  | //   enum { | 
|  | //     value = M ? (N ? Ackermann<M-1, Ackermann<M, N-1> >::value | 
|  | //                    : Ackermann<M-1, 1>::value) | 
|  | //               : N + 1 | 
|  | //   }; | 
|  | // }; | 
|  |  | 
|  | template<unsigned M, unsigned N> | 
|  | struct Ackermann { | 
|  | enum { | 
|  | value = Ackermann<M-1, Ackermann<M, N-1>::value >::value | 
|  | }; | 
|  | }; | 
|  |  | 
|  | template<unsigned M> struct Ackermann<M, 0> { | 
|  | enum { | 
|  | value = Ackermann<M-1, 1>::value | 
|  | }; | 
|  | }; | 
|  |  | 
|  | template<unsigned N> struct Ackermann<0, N> { | 
|  | enum { | 
|  | value = N + 1 | 
|  | }; | 
|  | }; | 
|  |  | 
|  | template<> struct Ackermann<0, 0> { | 
|  | enum { | 
|  | value = 1 | 
|  | }; | 
|  | }; | 
|  |  | 
|  | int g0[Ackermann<3, 4>::value == 125 ? 1 : -1]; | 
|  |  |