xref: /minix3/external/bsd/llvm/dist/clang/test/CXX/class/class.mem/p8-0x.cpp (revision f4a2713ac843a11c696ec80c0a5e3e5d80b4d338)
1*f4a2713aSLionel Sambuc // RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s
2*f4a2713aSLionel Sambuc 
3*f4a2713aSLionel Sambuc struct Base1 {
4*f4a2713aSLionel Sambuc   virtual void g();
5*f4a2713aSLionel Sambuc };
6*f4a2713aSLionel Sambuc 
7*f4a2713aSLionel Sambuc struct A : Base1 {
8*f4a2713aSLionel Sambuc   virtual void g() override override; // expected-error {{class member already marked 'override'}}
9*f4a2713aSLionel Sambuc   virtual void h() final final; // expected-error {{class member already marked 'final'}}
10*f4a2713aSLionel Sambuc };
11*f4a2713aSLionel Sambuc 
12*f4a2713aSLionel Sambuc struct Base2 {
13*f4a2713aSLionel Sambuc   virtual void e1(), e2();
14*f4a2713aSLionel Sambuc   virtual void f();
15*f4a2713aSLionel Sambuc };
16*f4a2713aSLionel Sambuc 
17*f4a2713aSLionel Sambuc struct B : Base2 {
18*f4a2713aSLionel Sambuc   virtual void e1() override, e2(int);  // No error.
19*f4a2713aSLionel Sambuc   virtual void f() override;
20*f4a2713aSLionel Sambuc   void g() override; // expected-error {{only virtual member functions can be marked 'override'}}
21*f4a2713aSLionel Sambuc   int h override; // expected-error {{only virtual member functions can be marked 'override'}}
22*f4a2713aSLionel Sambuc };
23*f4a2713aSLionel Sambuc 
24*f4a2713aSLionel Sambuc struct C {
25*f4a2713aSLionel Sambuc   virtual void f() final;
26*f4a2713aSLionel Sambuc   void g() final; // expected-error {{only virtual member functions can be marked 'final'}}
27*f4a2713aSLionel Sambuc   int h final; // expected-error {{only virtual member functions can be marked 'final'}}
28*f4a2713aSLionel Sambuc };
29*f4a2713aSLionel Sambuc 
30*f4a2713aSLionel Sambuc namespace inline_extension {
31*f4a2713aSLionel Sambuc   struct Base1 {
ginline_extension::Base132*f4a2713aSLionel Sambuc     virtual void g() {}
33*f4a2713aSLionel Sambuc   };
34*f4a2713aSLionel Sambuc 
35*f4a2713aSLionel Sambuc   struct A : Base1 {
ginline_extension::A36*f4a2713aSLionel Sambuc     virtual void g() override override {} // expected-error {{class member already marked 'override'}}
hinline_extension::A37*f4a2713aSLionel Sambuc     virtual void h() final final {} // expected-error {{class member already marked 'final'}}
38*f4a2713aSLionel Sambuc   };
39*f4a2713aSLionel Sambuc 
40*f4a2713aSLionel Sambuc   struct Base2 {
41*f4a2713aSLionel Sambuc     virtual void f();
42*f4a2713aSLionel Sambuc   };
43*f4a2713aSLionel Sambuc 
44*f4a2713aSLionel Sambuc   struct B : Base2 {
finline_extension::B45*f4a2713aSLionel Sambuc     virtual void f() override {}
ginline_extension::B46*f4a2713aSLionel Sambuc     void g() override {} // expected-error {{only virtual member functions can be marked 'override'}}
47*f4a2713aSLionel Sambuc   };
48*f4a2713aSLionel Sambuc 
49*f4a2713aSLionel Sambuc   struct C {
finline_extension::C50*f4a2713aSLionel Sambuc     virtual void f() final {}
ginline_extension::C51*f4a2713aSLionel Sambuc     void g() final {} // expected-error {{only virtual member functions can be marked 'final'}}
52*f4a2713aSLionel Sambuc   };
53*f4a2713aSLionel Sambuc }
54