xref: /llvm-project/clang/test/CXX/class/class.mem/p8-0x.cpp (revision 9ca5c425826329d5b23300bbc8a1a7c10a19c64d)
1*9ca5c425SRichard Smith // RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s
2b4801436SAnders Carlsson 
3b4801436SAnders Carlsson struct Base1 {
4b4801436SAnders Carlsson   virtual void g();
5b4801436SAnders Carlsson };
6b4801436SAnders Carlsson 
7b4801436SAnders Carlsson struct A : Base1 {
8725987b0SAnders Carlsson   virtual void g() override override; // expected-error {{class member already marked 'override'}}
9725987b0SAnders Carlsson   virtual void h() final final; // expected-error {{class member already marked 'final'}}
105610490cSAnders Carlsson };
1113a69102SAnders Carlsson 
12b4801436SAnders Carlsson struct Base2 {
1324b2a822SNico Weber   virtual void e1(), e2();
14b4801436SAnders Carlsson   virtual void f();
15b4801436SAnders Carlsson };
16b4801436SAnders Carlsson 
17b4801436SAnders Carlsson struct B : Base2 {
1824b2a822SNico Weber   virtual void e1() override, e2(int);  // No error.
1913a69102SAnders Carlsson   virtual void f() override;
2013a69102SAnders Carlsson   void g() override; // expected-error {{only virtual member functions can be marked 'override'}}
2113a69102SAnders Carlsson   int h override; // expected-error {{only virtual member functions can be marked 'override'}}
2213a69102SAnders Carlsson };
2313a69102SAnders Carlsson 
2413a69102SAnders Carlsson struct C {
2513a69102SAnders Carlsson   virtual void f() final;
2613a69102SAnders Carlsson   void g() final; // expected-error {{only virtual member functions can be marked 'final'}}
2713a69102SAnders Carlsson   int h final; // expected-error {{only virtual member functions can be marked 'final'}}
2813a69102SAnders Carlsson };
2924b2a822SNico Weber 
3024b2a822SNico Weber namespace inline_extension {
3124b2a822SNico Weber   struct Base1 {
ginline_extension::Base13224b2a822SNico Weber     virtual void g() {}
3324b2a822SNico Weber   };
3424b2a822SNico Weber 
3524b2a822SNico Weber   struct A : Base1 {
ginline_extension::A3624b2a822SNico Weber     virtual void g() override override {} // expected-error {{class member already marked 'override'}}
hinline_extension::A3724b2a822SNico Weber     virtual void h() final final {} // expected-error {{class member already marked 'final'}}
3824b2a822SNico Weber   };
3924b2a822SNico Weber 
4024b2a822SNico Weber   struct Base2 {
4124b2a822SNico Weber     virtual void f();
4224b2a822SNico Weber   };
4324b2a822SNico Weber 
4424b2a822SNico Weber   struct B : Base2 {
finline_extension::B4524b2a822SNico Weber     virtual void f() override {}
ginline_extension::B4624b2a822SNico Weber     void g() override {} // expected-error {{only virtual member functions can be marked 'override'}}
4724b2a822SNico Weber   };
4824b2a822SNico Weber 
4924b2a822SNico Weber   struct C {
finline_extension::C5024b2a822SNico Weber     virtual void f() final {}
ginline_extension::C5124b2a822SNico Weber     void g() final {} // expected-error {{only virtual member functions can be marked 'final'}}
5224b2a822SNico Weber   };
5324b2a822SNico Weber }
54