1// { dg-do run } 2// { dg-options "-fno-strict-aliasing" } 3// Test various aspects of vtable layout. 4// Origin: Mark Mitchell <mark@codesourcery.com> 5 6#if defined (__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100 7 8struct S0 9{ 10 virtual void h () 11 { 12 } 13 14 int k; 15}; 16 17 18struct S1 19{ 20 virtual void f () 21 { 22 } 23 24 int i; 25}; 26 27struct S2 : virtual public S0 28{ 29 virtual void g () 30 { 31 } 32 33 int j; 34}; 35 36struct S3 37{ 38 virtual void k () 39 { 40 } 41 42 int l; 43}; 44 45struct S4 : public virtual S1, public S2, public S3 46{ 47}; 48 49inline void* vtable (void *object) 50{ 51 // The vptr is always the first part of the object. 52 return * (void **) object; 53} 54 55int main () 56{ 57 // The vtable layout order for S4 should consist of S4's primary 58 // vtable (shared with S2), followed by the vtable for S3 (because 59 // it is a non-virtual base). Then, these should be followed by the 60 // the vtables for S1 and S0, which are virtual. 61 S4 s4; 62 S0 *s0 = &s4; 63 S1 *s1 = &s4; 64 S2 *s2 = &s4; 65 S3 *s3 = &s4; 66 67 if (vtable (&s4) != vtable (s2)) 68 return 1; 69 if (vtable (s2) >= vtable (s3)) 70 return 2; 71 if (vtable (s3) >= vtable (s1)) 72 return 3; 73 if (vtable (s1) >= vtable (s0)) 74 return 4; 75} 76 77#else /* !(defined (__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100) */ 78 79int main () 80{ 81} 82 83#endif /* !(defined (__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100) */ 84