Home | History | Annotate | Download | only in SemaTemplate
      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