1// { dg-do compile { target c++11 } } 2struct B 3{ 4 virtual void f() final {} 5 virtual void g() {} 6 virtual void x() const {} 7 virtual void y() final; 8}; 9 10void B::y() {} // { dg-error "overriding" } 11 12struct B2 13{ 14 virtual void h() {} 15}; 16 17struct D : B 18{ 19 virtual void g() override final {} // { dg-error "overriding" } 20 virtual void y() override final {} // { dg-error "virtual" } 21}; 22 23template <class T> struct D2 : T 24{ 25 void h() override {} // { dg-error "marked 'override', but does not override" } 26}; 27 28template <class T> struct D3 : T 29{ 30 void h() override {} 31}; 32 33struct D4 : D 34{ 35 void g() {} // { dg-error "virtual function" } 36}; 37 38struct B3 39{ 40 virtual void f() final final {} // { dg-error "duplicate virt-specifier" } 41}; 42 43struct B4 44{ 45 void f() final {} // { dg-error "marked 'final', but is not virtual" } 46}; 47 48struct D5 : B 49{ 50 void ff() override {} // { dg-error "marked 'override', but does not override" } 51 virtual void fff() override {} // { dg-error "marked 'override', but does not override" } 52 virtual void x() override {} // { dg-error "marked 'override', but does not override" } 53 void g() override; 54}; 55 56void D5::g() override {} // { dg-error "not allowed outside a class definition" } 57void g() override {} // { dg-error "not allowed outside a class definition" } 58 59struct B5 60{ 61 friend void f() final; // { dg-error "may not have virt-specifiers" } 62 friend void g() override; // { dg-error "may not have virt-specifiers" } 63 template <class T> void h() final; // { dg-error "may not have virt-specifiers" } 64 template <class T> void i() override; // { dg-error "may not have virt-specifiers" } 65}; 66 67int main() 68{ 69 D2<B> d; 70 D2<B2> d2; 71 D3<B2> d3; 72} 73