183098Smp// { dg-do compile { target c++11 } } 283098Smpstruct B 359243Sobrien{ 483098Smp virtual void f() final {} 583098Smp virtual void g() {} 659243Sobrien virtual void x() const {} 759243Sobrien virtual void y() final; 859243Sobrien}; 959243Sobrien 1059243Sobrienvoid B::y() {} // { dg-error "overriding" } 1159243Sobrien 1259243Sobrienstruct B2 1359243Sobrien{ 1459243Sobrien virtual void h() {} 1559243Sobrien}; 1659243Sobrien 1759243Sobrienstruct D : B 18100616Smp{ 1959243Sobrien virtual void g() override final {} // { dg-error "overriding" } 2059243Sobrien virtual void y() override final {} // { dg-error "virtual" } 2159243Sobrien}; 2259243Sobrien 2359243Sobrientemplate <class T> struct D2 : T 2459243Sobrien{ 2559243Sobrien void h() override {} // { dg-error "marked 'override', but does not override" } 2659243Sobrien}; 2759243Sobrien 2859243Sobrientemplate <class T> struct D3 : T 2959243Sobrien{ 3059243Sobrien void h() override {} 3159243Sobrien}; 3259243Sobrien 3359243Sobrienstruct D4 : D 3483098Smp{ 3559243Sobrien void g() {} // { dg-error "virtual function" } 3659243Sobrien}; 3759243Sobrien 3859243Sobrienstruct B3 3959243Sobrien{ 4059243Sobrien virtual void f() final final {} // { dg-error "duplicate virt-specifier" } 4183098Smp}; 4283098Smp 4383098Smpstruct B4 4483098Smp{ 4583098Smp void f() final {} // { dg-error "marked 'final', but is not virtual" } 4683098Smp}; 47167465Smp 4883098Smpstruct D5 : B 4983098Smp{ 5083098Smp void ff() override {} // { dg-error "marked 'override', but does not override" } 5183098Smp virtual void fff() override {} // { dg-error "marked 'override', but does not override" } 5283098Smp virtual void x() override {} // { dg-error "marked 'override', but does not override" } 5383098Smp void g() override; 54167465Smp}; 55167465Smp 56167465Smpvoid D5::g() override {} // { dg-error "not allowed outside a class definition" } 57167465Smpvoid g() override {} // { dg-error "not allowed outside a class definition" } 58167465Smp 5959243Sobrienstruct B5 6059243Sobrien{ 6183098Smp friend void f() final; // { dg-error "may not have virt-specifiers" } 6283098Smp friend void g() override; // { dg-error "may not have virt-specifiers" } 6383098Smp template <class T> void h() final; // { dg-error "may not have virt-specifiers" } 6483098Smp template <class T> void i() override; // { dg-error "may not have virt-specifiers" } 6583098Smp}; 6683098Smp 6783098Smpint main() 6859243Sobrien{ 6983098Smp D2<B> d; 7083098Smp D2<B2> d2; 7183098Smp D3<B2> d3; 7283098Smp} 7359243Sobrien