1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -fsyntax-only -triple %itanium_abi_triple -verify %s -std=c++11 2651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -fsyntax-only -triple %ms_abi_triple -verify %s -std=c++11 3d7ba27dc562e1837703fa8696531c1f21a5fdb36Anders Carlssonnamespace T1 { 4d7ba27dc562e1837703fa8696531c1f21a5fdb36Anders Carlsson 5d7ba27dc562e1837703fa8696531c1f21a5fdb36Anders Carlssonclass A { 6d7ba27dc562e1837703fa8696531c1f21a5fdb36Anders Carlsson virtual int f(); // expected-note{{overridden virtual function is here}} 7d7ba27dc562e1837703fa8696531c1f21a5fdb36Anders Carlsson}; 8d7ba27dc562e1837703fa8696531c1f21a5fdb36Anders Carlsson 9d7ba27dc562e1837703fa8696531c1f21a5fdb36Anders Carlssonclass B : A { 10d7ba27dc562e1837703fa8696531c1f21a5fdb36Anders Carlsson virtual void f(); // expected-error{{virtual function 'f' has a different return type ('void') than the function it overrides (which has return type 'int')}} 11d7ba27dc562e1837703fa8696531c1f21a5fdb36Anders Carlsson}; 12d7ba27dc562e1837703fa8696531c1f21a5fdb36Anders Carlsson 13d7ba27dc562e1837703fa8696531c1f21a5fdb36Anders Carlsson} 14c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson 15c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlssonnamespace T2 { 16c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson 17c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlssonstruct a { }; 18c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlssonstruct b { }; 19c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson 20c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlssonclass A { 21c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson virtual a* f(); // expected-note{{overridden virtual function is here}} 22c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson}; 23c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson 24c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlssonclass B : A { 257c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall virtual b* f(); // expected-error{{return type of virtual function 'f' is not covariant with the return type of the function it overrides ('T2::b *' is not derived from 'T2::a *')}} 26c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson}; 27c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson 28c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson} 29c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson 30c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlssonnamespace T3 { 31c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson 32c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlssonstruct a { }; 336b2accb4793e16b2e93a8c2589f5df702231f17aJohn McCallstruct b : private a { }; // expected-note{{declared private here}} 34c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson 35c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlssonclass A { 36eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCall virtual a* f(); // FIXME: desired-note{{overridden virtual function is here}} 37c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson}; 38c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson 39c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlssonclass B : A { 407c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall virtual b* f(); // expected-error{{invalid covariant return for virtual function: 'T3::a' is a private base class of 'T3::b'}} 41c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson}; 42c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson 43c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson} 44c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson 45c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlssonnamespace T4 { 46c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson 47c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlssonstruct a { }; 48c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlssonstruct a1 : a { }; 49c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlssonstruct b : a, a1 { }; 50c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson 51c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlssonclass A { 52c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson virtual a* f(); // expected-note{{overridden virtual function is here}} 53c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson}; 54c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson 55c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlssonclass B : A { 567c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall virtual b* f(); // expected-error{{return type of virtual function 'f' is not covariant with the return type of the function it overrides (ambiguous conversion from derived class 'T4::b' to base class 'T4::a':\n\ 57c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson struct T4::b -> struct T4::a\n\ 58c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson struct T4::b -> struct T4::a1 -> struct T4::a)}} 59c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson}; 60c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson 61c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson} 62c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson 63c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlssonnamespace T5 { 64c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson 65c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlssonstruct a { }; 66c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson 67c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlssonclass A { 68c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson virtual a* const f(); 69c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson virtual a* const g(); // expected-note{{overridden virtual function is here}} 70c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson}; 71c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson 72c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlssonclass B : A { 73c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson virtual a* const f(); 747c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall virtual a* g(); // expected-error{{return type of virtual function 'g' is not covariant with the return type of the function it overrides ('T5::a *' has different qualifiers than 'T5::a *const')}} 75c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson}; 76c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson 77c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson} 78c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson 79c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlssonnamespace T6 { 80c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson 81c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlssonstruct a { }; 82c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson 83c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlssonclass A { 84c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson virtual const a* f(); 85c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson virtual a* g(); // expected-note{{overridden virtual function is here}} 86c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson}; 87c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson 88c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlssonclass B : A { 89c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson virtual a* f(); 900c42bb653dc40b1caae010618831e320af824b18Chris Lattner virtual const a* g(); // expected-error{{return type of virtual function 'g' is not covariant with the return type of the function it overrides (class type 'const T6::a *' is more qualified than class type 'T6::a *'}} 91c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson}; 92c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson 93c3a68b25cdd687d4beb59f083fcb22afe173286fAnders Carlsson} 9477b7f1d4fb782c9152f91b76f9f8b1d1af21bd35Anders Carlsson 9577b7f1d4fb782c9152f91b76f9f8b1d1af21bd35Anders Carlssonnamespace T7 { 9677b7f1d4fb782c9152f91b76f9f8b1d1af21bd35Anders Carlsson struct a { }; 9777b7f1d4fb782c9152f91b76f9f8b1d1af21bd35Anders Carlsson struct b { }; 9877b7f1d4fb782c9152f91b76f9f8b1d1af21bd35Anders Carlsson 9977b7f1d4fb782c9152f91b76f9f8b1d1af21bd35Anders Carlsson class A { 10077b7f1d4fb782c9152f91b76f9f8b1d1af21bd35Anders Carlsson a* f(); 10177b7f1d4fb782c9152f91b76f9f8b1d1af21bd35Anders Carlsson }; 10277b7f1d4fb782c9152f91b76f9f8b1d1af21bd35Anders Carlsson 10377b7f1d4fb782c9152f91b76f9f8b1d1af21bd35Anders Carlsson class B : A { 10477b7f1d4fb782c9152f91b76f9f8b1d1af21bd35Anders Carlsson virtual b* f(); 10577b7f1d4fb782c9152f91b76f9f8b1d1af21bd35Anders Carlsson }; 10677b7f1d4fb782c9152f91b76f9f8b1d1af21bd35Anders Carlsson} 107d3a505827fd8775ce479498e5726b484336eedd8Douglas Gregor 108be2e205add4c1f6375bb430e847b712a88581e46Anders Carlssonnamespace T8 { 109be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson struct a { }; 1107c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall struct b; // expected-note {{forward declaration of 'T8::b'}} 111be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson 112be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson class A { 113be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson virtual a *f(); 114be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson }; 115be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson 116be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson class B : A { 1177c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall b* f(); // expected-error {{return type of virtual function 'f' is not covariant with the return type of the function it overrides ('T8::b' is incomplete)}} 118be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson }; 119be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson} 120be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson 121be2e205add4c1f6375bb430e847b712a88581e46Anders Carlssonnamespace T9 { 122be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson struct a { }; 123be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson 124be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson template<typename T> struct b : a { 125b2b5cc0cf908d516a107d373db963f692449a8a8Chandler Carruth int a[sizeof(T) ? -1 : -1]; // expected-error {{array with a negative size}} 126be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson }; 127be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson 128be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson class A { 129be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson virtual a *f(); 130be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson }; 131be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson 132be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson class B : A { 1337c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall virtual b<int> *f(); // expected-note {{in instantiation of template class 'T9::b<int>' requested here}} 134be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson }; 135be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson} 136be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson 137d3a505827fd8775ce479498e5726b484336eedd8Douglas Gregor// PR5656 138d3a505827fd8775ce479498e5726b484336eedd8Douglas Gregorclass X0 { 139d3a505827fd8775ce479498e5726b484336eedd8Douglas Gregor virtual void f0(); 140d3a505827fd8775ce479498e5726b484336eedd8Douglas Gregor}; 141d3a505827fd8775ce479498e5726b484336eedd8Douglas Gregorclass X1 : public X0 { 142d3a505827fd8775ce479498e5726b484336eedd8Douglas Gregor void f0() = 0; 143d3a505827fd8775ce479498e5726b484336eedd8Douglas Gregor}; 1444ba3136b3eb9740a07bd61d0ab23ce9a8d894deeDouglas Gregor 1454ba3136b3eb9740a07bd61d0ab23ce9a8d894deeDouglas Gregortemplate <typename Base> 1464ba3136b3eb9740a07bd61d0ab23ce9a8d894deeDouglas Gregorstruct Foo : Base { 147e6342c06356976508525145a6ba433d05f893171Douglas Gregor void f(int) = 0; // expected-error{{not virtual and cannot be declared pure}} 1484ba3136b3eb9740a07bd61d0ab23ce9a8d894deeDouglas Gregor}; 1494ba3136b3eb9740a07bd61d0ab23ce9a8d894deeDouglas Gregor 150e6342c06356976508525145a6ba433d05f893171Douglas Gregorstruct Base1 { virtual void f(int); }; 1514ba3136b3eb9740a07bd61d0ab23ce9a8d894deeDouglas Gregorstruct Base2 { }; 1524ba3136b3eb9740a07bd61d0ab23ce9a8d894deeDouglas Gregor 1534ba3136b3eb9740a07bd61d0ab23ce9a8d894deeDouglas Gregorvoid test() { 1541ab537be683c31afba3272a61ddd13811967d3beDouglas Gregor (void)sizeof(Foo<Base1>); 1551ab537be683c31afba3272a61ddd13811967d3beDouglas Gregor (void)sizeof(Foo<Base2>); // expected-note{{instantiation}} 1564ba3136b3eb9740a07bd61d0ab23ce9a8d894deeDouglas Gregor} 157e6342c06356976508525145a6ba433d05f893171Douglas Gregor 158e6342c06356976508525145a6ba433d05f893171Douglas Gregortemplate<typename Base> 159e6342c06356976508525145a6ba433d05f893171Douglas Gregorstruct Foo2 : Base { 160e6342c06356976508525145a6ba433d05f893171Douglas Gregor template<typename T> int f(T); 161e6342c06356976508525145a6ba433d05f893171Douglas Gregor}; 162e6342c06356976508525145a6ba433d05f893171Douglas Gregor 163e6342c06356976508525145a6ba433d05f893171Douglas Gregorvoid test2() { 164e6342c06356976508525145a6ba433d05f893171Douglas Gregor Foo2<Base1> f1; 165e6342c06356976508525145a6ba433d05f893171Douglas Gregor Foo2<Base2> f2; 166e6342c06356976508525145a6ba433d05f893171Douglas Gregor f1.f(17); 167e6342c06356976508525145a6ba433d05f893171Douglas Gregor f2.f(17); 168e6342c06356976508525145a6ba433d05f893171Douglas Gregor}; 1691ab537be683c31afba3272a61ddd13811967d3beDouglas Gregor 1701ab537be683c31afba3272a61ddd13811967d3beDouglas Gregorstruct Foo3 { 17145f11b78750590b1b1bcec6746c7639a256ce2a2Chandler Carruth virtual void f(int) = 0; // expected-note{{unimplemented pure virtual method}} 1721ab537be683c31afba3272a61ddd13811967d3beDouglas Gregor}; 1731ab537be683c31afba3272a61ddd13811967d3beDouglas Gregor 1741ab537be683c31afba3272a61ddd13811967d3beDouglas Gregortemplate<typename T> 1751ab537be683c31afba3272a61ddd13811967d3beDouglas Gregorstruct Bar3 : Foo3 { 1761ab537be683c31afba3272a61ddd13811967d3beDouglas Gregor void f(T); 1771ab537be683c31afba3272a61ddd13811967d3beDouglas Gregor}; 1781ab537be683c31afba3272a61ddd13811967d3beDouglas Gregor 1791ab537be683c31afba3272a61ddd13811967d3beDouglas Gregorvoid test3() { 1801ab537be683c31afba3272a61ddd13811967d3beDouglas Gregor Bar3<int> b3i; // okay 1811ab537be683c31afba3272a61ddd13811967d3beDouglas Gregor Bar3<float> b3f; // expected-error{{is an abstract class}} 1821ab537be683c31afba3272a61ddd13811967d3beDouglas Gregor} 183be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson 184be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson// 5920 185be2e205add4c1f6375bb430e847b712a88581e46Anders Carlssonnamespace PR5920 { 186be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson class Base {}; 187be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson 188be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson template <typename T> 189be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson class Derived : public Base {}; 190be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson 191be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson class Foo { 192be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson public: 193be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson virtual Base* Method(); 194be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson }; 195be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson 196be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson class Bar : public Foo { 197be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson public: 198be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson virtual Derived<int>* Method(); 199be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson }; 200be2e205add4c1f6375bb430e847b712a88581e46Anders Carlsson} 201ceb7e001c488a7ea09dc631518515290518db47aChandler Carruth 202ceb7e001c488a7ea09dc631518515290518db47aChandler Carruth// Look through template types and typedefs to see whether return types are 203ceb7e001c488a7ea09dc631518515290518db47aChandler Carruth// pointers or references. 204ceb7e001c488a7ea09dc631518515290518db47aChandler Carruthnamespace PR6110 { 205ceb7e001c488a7ea09dc631518515290518db47aChandler Carruth class Base {}; 206ceb7e001c488a7ea09dc631518515290518db47aChandler Carruth class Derived : public Base {}; 207ceb7e001c488a7ea09dc631518515290518db47aChandler Carruth 208ceb7e001c488a7ea09dc631518515290518db47aChandler Carruth typedef Base* BaseP; 209ceb7e001c488a7ea09dc631518515290518db47aChandler Carruth typedef Derived* DerivedP; 210ceb7e001c488a7ea09dc631518515290518db47aChandler Carruth 211ceb7e001c488a7ea09dc631518515290518db47aChandler Carruth class X { virtual BaseP f(); }; 212ceb7e001c488a7ea09dc631518515290518db47aChandler Carruth class X1 : public X { virtual DerivedP f(); }; 213ceb7e001c488a7ea09dc631518515290518db47aChandler Carruth 214ceb7e001c488a7ea09dc631518515290518db47aChandler Carruth template <typename T> class Y { virtual T f(); }; 215ceb7e001c488a7ea09dc631518515290518db47aChandler Carruth template <typename T1, typename T> class Y1 : public Y<T> { virtual T1 f(); }; 216ceb7e001c488a7ea09dc631518515290518db47aChandler Carruth Y1<Derived*, Base*> y; 217ceb7e001c488a7ea09dc631518515290518db47aChandler Carruth} 218f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson 2197385779796f48e234b4fbea27ff205d7dfb34ce8Chandler Carruth// Defer checking for covariance if either return type is dependent. 2207385779796f48e234b4fbea27ff205d7dfb34ce8Chandler Carruthnamespace type_dependent_covariance { 2217385779796f48e234b4fbea27ff205d7dfb34ce8Chandler Carruth struct B {}; 2227385779796f48e234b4fbea27ff205d7dfb34ce8Chandler Carruth template <int N> struct TD : public B {}; 2237385779796f48e234b4fbea27ff205d7dfb34ce8Chandler Carruth template <> struct TD<1> {}; 2247385779796f48e234b4fbea27ff205d7dfb34ce8Chandler Carruth 2257385779796f48e234b4fbea27ff205d7dfb34ce8Chandler Carruth template <int N> struct TB {}; 2267385779796f48e234b4fbea27ff205d7dfb34ce8Chandler Carruth struct D : public TB<0> {}; 2277385779796f48e234b4fbea27ff205d7dfb34ce8Chandler Carruth 2287385779796f48e234b4fbea27ff205d7dfb34ce8Chandler Carruth template <int N> struct X { 2297385779796f48e234b4fbea27ff205d7dfb34ce8Chandler Carruth virtual B* f1(); // expected-note{{overridden virtual function is here}} 2307385779796f48e234b4fbea27ff205d7dfb34ce8Chandler Carruth virtual TB<N>* f2(); // expected-note{{overridden virtual function is here}} 2317385779796f48e234b4fbea27ff205d7dfb34ce8Chandler Carruth }; 2327385779796f48e234b4fbea27ff205d7dfb34ce8Chandler Carruth template <int N, int M> struct X1 : X<N> { 2337385779796f48e234b4fbea27ff205d7dfb34ce8Chandler Carruth virtual TD<M>* f1(); // expected-error{{return type of virtual function 'f1' is not covariant with the return type of the function it overrides ('TD<1> *'}} 2347c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall virtual D* f2(); // expected-error{{return type of virtual function 'f2' is not covariant with the return type of the function it overrides ('type_dependent_covariance::D *' is not derived from 'TB<1> *')}} 2357385779796f48e234b4fbea27ff205d7dfb34ce8Chandler Carruth }; 2367385779796f48e234b4fbea27ff205d7dfb34ce8Chandler Carruth 2377385779796f48e234b4fbea27ff205d7dfb34ce8Chandler Carruth X1<0, 0> good; 2387385779796f48e234b4fbea27ff205d7dfb34ce8Chandler Carruth X1<0, 1> bad_derived; // expected-note{{instantiation}} 2397385779796f48e234b4fbea27ff205d7dfb34ce8Chandler Carruth X1<1, 0> bad_base; // expected-note{{instantiation}} 2407385779796f48e234b4fbea27ff205d7dfb34ce8Chandler Carruth} 2417385779796f48e234b4fbea27ff205d7dfb34ce8Chandler Carruth 242f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlssonnamespace T10 { 243f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson struct A { }; 244f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson struct B : A { }; 245f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson 246f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson struct C { 247f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson virtual A&& f(); 248f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson }; 249f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson 250f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson struct D : C { 251f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson virtual B&& f(); 252f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson }; 253f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson}; 254f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson 255f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlssonnamespace T11 { 256f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson struct A { }; 257f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson struct B : A { }; 258f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson 259f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson struct C { 260f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson virtual A& f(); // expected-note {{overridden virtual function is here}} 261f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson }; 262f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson 263f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson struct D : C { 2647c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall virtual B&& f(); // expected-error {{virtual function 'f' has a different return type ('T11::B &&') than the function it overrides (which has return type 'T11::A &')}} 265f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson }; 266f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson}; 267f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson 268f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlssonnamespace T12 { 269f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson struct A { }; 270f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson struct B : A { }; 271f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson 272f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson struct C { 273f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson virtual A&& f(); // expected-note {{overridden virtual function is here}} 274f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson }; 275f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson 276f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson struct D : C { 2777c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall virtual B& f(); // expected-error {{virtual function 'f' has a different return type ('T12::B &') than the function it overrides (which has return type 'T12::A &&')}} 278f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson }; 279f2a04bf1689cd88dd04012c311ba86e9d8b2b1b2Anders Carlsson}; 280a6c1e3a56afb76876cd06e3646fd7ca57a38d4bbDouglas Gregor 281a6c1e3a56afb76876cd06e3646fd7ca57a38d4bbDouglas Gregornamespace PR8168 { 282a6c1e3a56afb76876cd06e3646fd7ca57a38d4bbDouglas Gregor class A { 283a6c1e3a56afb76876cd06e3646fd7ca57a38d4bbDouglas Gregor public: 284a6c1e3a56afb76876cd06e3646fd7ca57a38d4bbDouglas Gregor virtual void foo() {} // expected-note{{overridden virtual function is here}} 285a6c1e3a56afb76876cd06e3646fd7ca57a38d4bbDouglas Gregor }; 286a6c1e3a56afb76876cd06e3646fd7ca57a38d4bbDouglas Gregor 287a6c1e3a56afb76876cd06e3646fd7ca57a38d4bbDouglas Gregor class B : public A { 288a6c1e3a56afb76876cd06e3646fd7ca57a38d4bbDouglas Gregor public: 289a6c1e3a56afb76876cd06e3646fd7ca57a38d4bbDouglas Gregor static void foo() {} // expected-error{{'static' member function 'foo' overrides a virtual function}} 290a6c1e3a56afb76876cd06e3646fd7ca57a38d4bbDouglas Gregor }; 291a6c1e3a56afb76876cd06e3646fd7ca57a38d4bbDouglas Gregor} 292