| // PR c++/84296 |
| |
| namespace b {} |
| namespace c { |
| using namespace b; |
| } |
| namespace b { |
| template <int d> struct e { static const int f = d; }; |
| } |
| template <typename> struct g; |
| template <typename h, typename i, typename aa, typename j> |
| struct g<h(i, aa, j)> : h::template ab<i, aa, j> {}; |
| struct k { |
| template <typename l> struct m { typedef typename g<l>::n o; }; |
| }; |
| template <typename> struct ac; |
| struct r { |
| typedef ac<int> p; |
| }; |
| template <typename q> struct s : k { |
| template <typename i, typename, typename> |
| struct ab : q::template t<typename i::u>::template ab<i, int, int> {}; |
| }; |
| struct ad { |
| typedef int u; |
| }; |
| template <typename> struct ae; |
| template <typename, typename ag> struct ah { |
| typedef ae<ag> ai; |
| typedef typename ai::template w<ai(r, int)>::o n; |
| }; |
| struct x { |
| template <typename i, typename, typename> struct ab : ah<i, int> {}; |
| }; |
| struct y { |
| struct z { |
| template <typename> struct t : x {}; |
| }; |
| struct aj : s<z> {}; |
| }; |
| template <typename i> struct ak { |
| typedef y::aj al; |
| typedef typename al::m<al(i, int, int)>::o o; |
| }; |
| struct am { |
| enum { an }; |
| }; |
| template <typename> struct ao {}; |
| template <typename af> struct ap : af::aq {}; |
| template <> struct ae<int> { |
| template <typename> struct w; |
| template <typename ar, typename as, typename at> struct w<ar(as, at)> { |
| typedef typename as::p o; |
| }; |
| }; |
| enum { a = b::e<0>::f }; |
| template <typename> class au; |
| template <typename av> struct ac : ao<av> { typedef c::e<am::an> aq; }; |
| template <typename aw, typename i, typename ax> void ay(aw, i, ax) { |
| // Not sure if this has been creduced from an initialization of a |
| // variable to a block-scope extern function decl |
| au<c::e<ap<typename ak<i>::o>::f> > az2(); // { dg-warning "empty parentheses" } |
| } |
| void v() { |
| ad a; |
| void az1(); |
| ay(az1, a, v); |
| } |