| // { dg-do run } |
| |
| #include <assert.h> |
| struct V { |
| V(): virtual_value(-123) {} |
| int virtual_value; |
| virtual int access_vv() { return virtual_value; } |
| }; |
| |
| struct A: virtual public V { |
| A():value(123) {} |
| int value; |
| virtual int access() { return value; } |
| }; |
| struct B: virtual public V { |
| B():value(456) {} |
| int value; |
| virtual int access() { return value; } |
| }; |
| struct C : public A, public B { |
| C():better_value(789) {} |
| int better_value; |
| virtual int access() { return better_value; } |
| }; |
| struct D: public A, public B { |
| D():better_virtual_value(-345) {} |
| int better_virtual_value; |
| virtual int access_vv() { return better_virtual_value; } |
| }; |
| |
| int use(B *b) |
| { |
| return b->access(); |
| } |
| |
| int v_use(V * v) |
| { |
| return v->access_vv(); |
| } |
| |
| int main() |
| { |
| C c; |
| assert(v_use(&c) == -123); |
| D d; |
| assert(v_use(&d) == -345); |
| return 0; |
| } |