131
|
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 }
|