// { dg-do run } // Testcase for implicit 'typename' and resolution of 'typename's in the // current scope. class base1 { public: int bar() const { return 1; } }; class base2 { public: int bar() const { return 0; } }; template struct base_trait { typedef base1 base; }; template<> struct base_trait { typedef base2 base; }; template class weird : public base_trait::base { public: typedef typename base_trait::base base; base f (); int base::* g (); int zowee() const { return this->bar(); } }; template typename weird::base weird::f () { return base(); } // The standard does not allow this case; the `typename' keyword may // not appear in a ptr-operator. #if 0 template int typename weird::base::* weird::g () { return 0; } #endif int main() { weird z; return z.zowee() || z.f().bar(); }