1// PR c++/62255
2
3// It's not clear whether this is well-formed; instantiating the
4// initializer of 'value' causes the instantiation of Derived, which in
5// turn requires the value of 'value', but the recursion ends there, so it
6// seems reasonable to allow it.
7
8template <typename T> struct Test {
9  template<typename X> static int check(typename X::Type*);
10  template<typename> static char check(...);
11  static const bool value = (sizeof(check<T>(0)) == sizeof(int));
12};
13template <int> struct Sink { };
14template <typename T> struct Derived : Sink<Test<Derived<T> >::value> {
15  typedef int Type;
16};
17
18Sink<Test<Derived<int> >::value> s;
19