1 // { dg-do compile { target c++11 } } 2 struct B 3 { fB4 virtual void f() final {} gB5 virtual void g() {} xB6 virtual void x() const {} 7 virtual void y() final; 8 }; 9 y()10void B::y() {} // { dg-error "overriding" } 11 12 struct B2 13 { hB214 virtual void h() {} 15 }; 16 17 struct D : B 18 { gD19 virtual void g() override final {} // { dg-error "overriding" } yD20 virtual void y() override final {} // { dg-error "virtual" } 21 }; 22 23 template <class T> struct D2 : T 24 { hD225 void h() override {} // { dg-error "marked 'override', but does not override" } 26 }; 27 28 template <class T> struct D3 : T 29 { hD330 void h() override {} 31 }; 32 33 struct D4 : D 34 { gD435 void g() {} // { dg-error "virtual function" } 36 }; 37 38 struct B3 39 { fB340 virtual void f() final final {} // { dg-error "duplicate virt-specifier" } 41 }; 42 43 struct B4 44 { fB445 void f() final {} // { dg-error "marked 'final', but is not virtual" } 46 }; 47 48 struct D5 : B 49 { ffD550 void ff() override {} // { dg-error "marked 'override', but does not override" } fffD551 virtual void fff() override {} // { dg-error "marked 'override', but does not override" } xD552 virtual void x() override {} // { dg-error "marked 'override', but does not override" } 53 void g() override; 54 }; 55 g()56void D5::g() override {} // { dg-error "not allowed outside a class definition" } g()57void g() override {} // { dg-error "not allowed outside a class definition" } 58 59 struct 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 main()67int main() 68 { 69 D2<B> d; 70 D2<B2> d2; 71 D3<B2> d3; 72 } 73