1 // PR c++/70906 2 // { dg-do compile { target c++11 } } 3 // { dg-options "-Wall" } 4 5 template <typename> struct B; 6 template <typename U> struct F { typedef U *t; }; 7 template <class> struct D {}; 8 template <class VP> struct L { 9 typedef VP np; 10 typedef typename F<D<VP>>::t cnp; 11 }; 12 struct P { typedef L<void *> nt; }; 13 template <class N> struct I { typedef typename N::template A<int> t; }; 14 template <class O1> struct Q { typedef typename I<O1>::t t; }; 15 template <class T, class Hook, Hook T::*> struct G; 16 template <typename P, typename M, M P::*PM> 17 struct mh { 18 template <class> struct A { typedef G<P, M, PM> pvt; }; 19 }; 20 template <typename T> struct B<T *> { static T pt(T); }; 21 struct R : public D<void *> { typedef P ht; }; 22 class lmh : public R {}; 23 template <class T, class Hook, Hook T::*P> struct G { 24 typedef Hook Ht; 25 typedef typename Ht::ht::nt nt; 26 typedef T vt; 27 typedef typename nt::np np; 28 typedef typename nt::cnp cnp; 29 static np tnp(T &); 30 static cnp tnp(const T &p1) { 31 B<cnp>::pt(static_cast<const Ht &>(p1.*P)); 32 return cnp (); 33 } 34 }; 35 template <class T, class S> struct K { 36 template <S> struct J; 37 template <class U> static int foo(J<U::tnp> *, int); 38 static const int c = sizeof(foo<T>(0, 0)); 39 }; 40 template <class V> struct W1 { 41 typedef typename V::vt vt; 42 static const bool value = K<V, typename V::np (*)(vt &)>::c == K<V, typename V::cnp (*)(const vt &)>::c; 43 }; 44 template <class V> struct O { 45 static const bool svt = W1<V>::value; 46 }; 47 template <bool> struct M {}; 48 template <class V> class C { 49 static const bool svt = O<V>::svt; 50 M<svt> m; 51 }; 52 template <class V> struct H { 53 C<V> bar(); 54 }; 55 template <class O1> struct ml { 56 typedef typename Q<O1>::t po; 57 typedef H<typename po::pvt> t; 58 }; 59 template <class O1> class list : public ml<O1>::t {}; 60 struct N { 61 struct IV { lmh hk; }; 62 typedef list<mh<IV, lmh, &IV::hk>> ISL; 63 friend void fn1(int &, N const &); 64 }; 65 void fn1(int &, N const &) { 66 N::ISL xl; 67 for (xl.bar();;) 68 ; 69 } 70