// { dg-do run } template struct A { int f() { return 1; } }; template struct B : A { int f() { return 2; } using A::f; void g() { if (A::f() != 1 ) __builtin_abort(); if( B::f() != 2 ) __builtin_abort(); if( this->f() != 2 ) __builtin_abort(); } }; template struct C { int h( int i ) { return 1; } int h( double d ) { return 2; } }; template struct D : private C { using C::h; int h( char c ) { return 0; } int h() { return 3; } }; int main() { B b; b.g(); b.f(); b.A::f(); b.B::f(); D d; if( d.h( 'a' ) != 0 ) __builtin_abort(); if( d.h( 3 ) != 1 ) __builtin_abort(); if( d.h( 3.14 ) != 2 ) __builtin_abort(); if( d.h() != 3 ) __builtin_abort(); }