// { dg-do run } // Test that we only call f once and that pointers to different subobjects // compare as different. struct A { void f() { } }; struct B: public A { }; struct C: public A { }; struct D : public B, public C { }; typedef void (B::*bp)(); typedef void (C::*cp)(); typedef void (D::*dp)(); dp d1; int call; dp f () { ++call; return d1; } int main() { bp b = &A::f; cp c = &A::f; d1 = b; dp d2 = c; return (f() == d2 || call != 1); }