// { dg-do compile } // { dg-options "-O3 -std=gnu++1y -w" } namespace { template b c(b); template class> struct f { using g = d; }; template class aa> using h = f; template class aa> using i = typename h::g; template struct j { typedef b k; }; } // namespace namespace l { template class m { public: typedef b k; }; } // namespace l namespace a { template using n = l::m; template class ac : public n {}; struct s { template using ad = typename b::e; }; template struct p : s { typedef typename o::k k; using ag = i; }; } // namespace a namespace l { template struct t : a::p {}; } // namespace l namespace a { template struct al { template static void an(am ao, am) { c(*ao); } }; template void aq(am ao, am ap) { typedef typename j::k ar; al<__has_trivial_destructor(ar)>::an(ao, ap); } namespace { typedef char au; } } // namespace a typedef char av; typedef int aw; typedef av ay; typedef aw az; namespace a { template struct ba { typedef typename l::t::ag ag; struct { ag bb; ag bc; } bd; }; template > class be : ba { typedef ba bf; typedef typename bf::ag ag; public: void bh() { bi(this->bd.bb); } void bi(ag bj) { aq(bj, this->bd.bc); } }; } // namespace a namespace bk { enum bl {}; enum bn { bo }; class q { public: static a::au bp(bn); static bool bq(a::au *br, bn g) { return bs(br, g); } static bl bs(a::au *br, bn g) { if (br) { auto bt = bp(g); if (bt) return bl(); } } }; template class bu {}; } // namespace bk namespace bv { namespace bw { class bx; } } // namespace bv namespace bk { enum by { bz }; struct ca; class cb { public: class cc { public: virtual void cd(by) = 0; }; virtual bu e(); cc *cf; }; class cg { public: ~cg() { q::bq(ch, bo); } a::au *ch; }; class ci { cg cj; }; namespace ck { enum cl : ay; } class r : ci {}; class cn { public: ck::cl co(); }; by cp(ck::cl); class cq : cb, cb::cc { bu ce(bv::bw::bx &, az) noexcept; void cd(by); void cr(bv::bw::bx &, az, cb::cc *) noexcept; cn cs; a::be ct; }; } // namespace bk using bv::bw::bx; namespace bk { bu cq::ce(bx &, az) noexcept { ct.bh(); } void cq::cr(bx &, az, cb::cc *) noexcept { cd(bz); } void cq::cd(by) { cf->cd(cp(cs.co())); } } // namespace bk