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