blob: fc523e392eafefe17780b5ff3b312d1df995b914 [file] [log] [blame]
Daniel Dunbara5728872009-12-15 20:14:24 +00001// RUN: %clang_cc1 -fsyntax-only -verify %s
Andy Gibbs8e8fb3b2012-10-19 12:44:48 +00002// expected-no-diagnostics
Douglas Gregor199d9912009-06-05 00:53:49 +00003
4// template<unsigned M, unsigned N>
5// struct Ackermann {
6// enum {
Daniel Dunbar70b87422009-07-11 22:44:48 +00007// value = M ? (N ? Ackermann<M-1, Ackermann<M, N-1> >::value
Douglas Gregor199d9912009-06-05 00:53:49 +00008// : 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
Daniel Dunbar70b87422009-07-11 22:44:48 +000038int g0[Ackermann<3, 4>::value == 125 ? 1 : -1];
39