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