The following program should return 1 when executed: struct A { virtual int f() {return 1;} }; struct B : virtual A { virtual int f() {return 0;} }; struct C : B , virtual A { using A::f; }; int main () { C c; return c.f () + c.C::f (); } It actually returns 2. The C++ standard section 10.3 shows the example which somewhat matches the code above. The 'c.f()' is supposed to call 'B::f' and the 'c.C::f()' is supposed to call 'A::f'. In fact, both call 'A::f'.
This is a dup of bug 11750, it was not hard to find that bug. Anyways the problem here is that we still use mostly the old ARM style using semantics instead of the standard defined ones. *** This bug has been marked as a duplicate of 11750 ***