1// { dg-do run } 2 3// Copyright (C) 2003 Free Software Foundation, Inc. 4// Contributed by Nathan Sidwell 12 Dec 2003 <nathan@codesourcery.com> 5// Origin: grigory@stl.sarov.ru 6 7// PR c++/13118. Missing covariant thunk. 8 9struct c0 {}; 10struct c1 : virtual c0 { 11 virtual c0* f6(); 12}; 13 14struct c5 { 15 virtual void foo(); 16}; 17 18struct c10 : virtual c1 { 19 virtual void foo(); 20}; 21 22struct c1a : c1 {}; // disambiguation 23 24struct c11 : virtual c10, c1a { 25 int i; 26 virtual c1* f6 () = 0; 27}; 28 29struct c18 : c5, virtual c1 { 30 virtual void bar(); 31}; 32 33struct c28 : virtual c0, virtual c11 { 34 virtual c18* f6(); 35}; 36 37c0 *c1::f6 () {} 38void c5::foo () {} 39void c10::foo () {} 40void c18::bar () {} 41 42c18 ret; 43 44c18 *c28::f6 () 45{ 46 return &ret; 47} 48 49bool check_c1 (c1 *ptr) 50{ 51 c0 *r = ptr->f6 (); 52 return r != &ret; 53} 54bool check_c10 (c10 *ptr) 55{ 56 c0 *r = ptr->f6 (); 57 return r != &ret; 58} 59bool check_c11 (c11 *ptr) 60{ 61 c1 *r = ptr->f6 (); 62 return r != &ret; 63} 64bool check_c28 (c28 *ptr) 65{ 66 c18 *r = ptr->f6 (); 67 return r != &ret; 68} 69 70int main () 71{ 72 c28 obj; 73 74 if (check_c1 (static_cast<c1a *> (&obj))) 75 return 1; 76 if (check_c1 (static_cast<c10 *> (&obj))) 77 return 2; 78 if (check_c10 (&obj)) 79 return 3; 80 if (check_c11 (&obj)) 81 return 4; 82 if (check_c28 (&obj)) 83 return 5; 84 return 0; 85} 86