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