ackermann.cpp 717 B

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