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()10 void B::y() {} // { dg-message "overridden" }
11 
12 struct B2
13 {
hB214   virtual void h() {}
15 };
16 
17 struct D : B
18 {
gD19   virtual void g() override final {} // { dg-message "overridden" }
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()56 void D5::g() override {} // { dg-error "not allowed outside a class definition" }
g()57 void 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()67 int main()
68 {
69   D2<B> d;
70   D2<B2> d2;
71   D3<B2> d3;
72 }
73