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