1 // PR c++/84296 2 3 namespace b {} 4 namespace c { 5 using namespace b; 6 } 7 namespace b { 8 template <int d> struct e { static const int f = d; }; 9 } 10 template <typename> struct g; 11 template <typename h, typename i, typename aa, typename j> 12 struct g<h(i, aa, j)> : h::template ab<i, aa, j> {}; 13 struct k { 14 template <typename l> struct m { typedef typename g<l>::n o; }; 15 }; 16 template <typename> struct ac; 17 struct r { 18 typedef ac<int> p; 19 }; 20 template <typename q> struct s : k { 21 template <typename i, typename, typename> 22 struct ab : q::template t<typename i::u>::template ab<i, int, int> {}; 23 }; 24 struct ad { 25 typedef int u; 26 }; 27 template <typename> struct ae; 28 template <typename, typename ag> struct ah { 29 typedef ae<ag> ai; 30 typedef typename ai::template w<ai(r, int)>::o n; 31 }; 32 struct x { 33 template <typename i, typename, typename> struct ab : ah<i, int> {}; 34 }; 35 struct y { 36 struct z { 37 template <typename> struct t : x {}; 38 }; 39 struct aj : s<z> {}; 40 }; 41 template <typename i> struct ak { 42 typedef y::aj al; 43 typedef typename al::m<al(i, int, int)>::o o; 44 }; 45 struct am { 46 enum { an }; 47 }; 48 template <typename> struct ao {}; 49 template <typename af> struct ap : af::aq {}; 50 template <> struct ae<int> { 51 template <typename> struct w; 52 template <typename ar, typename as, typename at> struct w<ar(as, at)> { 53 typedef typename as::p o; 54 }; 55 }; 56 enum { a = b::e<0>::f }; 57 template <typename> class au; 58 template <typename av> struct ac : ao<av> { typedef c::e<am::an> aq; }; 59 template <typename aw, typename i, typename ax> void ay(aw, i, ax) { 60 au<c::e<ap<typename ak<i>::o>::f> > az(); 61 } 62 void v() { 63 ad a; 64 void az(); 65 ay(az, a, v); 66 } 67