1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s
2c7119a871df4d2d79db3e48fc9d0ab421be54a3dAnders Carlsson
3c7119a871df4d2d79db3e48fc9d0ab421be54a3dAnders Carlssonstruct Base1 {
4c7119a871df4d2d79db3e48fc9d0ab421be54a3dAnders Carlsson  virtual void g();
5c7119a871df4d2d79db3e48fc9d0ab421be54a3dAnders Carlsson};
6c7119a871df4d2d79db3e48fc9d0ab421be54a3dAnders Carlsson
7c7119a871df4d2d79db3e48fc9d0ab421be54a3dAnders Carlssonstruct A : Base1 {
898367f0322ac43fa5b0c7ccb33bab95f66b960f6Anders Carlsson  virtual void g() override override; // expected-error {{class member already marked 'override'}}
998367f0322ac43fa5b0c7ccb33bab95f66b960f6Anders Carlsson  virtual void h() final final; // expected-error {{class member already marked 'final'}}
10b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson};
11aae5af24f031ad5f17872bd8b27ed5c175c0f90cAnders Carlsson
12c7119a871df4d2d79db3e48fc9d0ab421be54a3dAnders Carlssonstruct Base2 {
134867347e82648d3baf09524b98b09c297a5a198fNico Weber  virtual void e1(), e2();
14c7119a871df4d2d79db3e48fc9d0ab421be54a3dAnders Carlsson  virtual void f();
15c7119a871df4d2d79db3e48fc9d0ab421be54a3dAnders Carlsson};
16c7119a871df4d2d79db3e48fc9d0ab421be54a3dAnders Carlsson
17c7119a871df4d2d79db3e48fc9d0ab421be54a3dAnders Carlssonstruct B : Base2 {
184867347e82648d3baf09524b98b09c297a5a198fNico Weber  virtual void e1() override, e2(int);  // No error.
19aae5af24f031ad5f17872bd8b27ed5c175c0f90cAnders Carlsson  virtual void f() override;
20aae5af24f031ad5f17872bd8b27ed5c175c0f90cAnders Carlsson  void g() override; // expected-error {{only virtual member functions can be marked 'override'}}
21aae5af24f031ad5f17872bd8b27ed5c175c0f90cAnders Carlsson  int h override; // expected-error {{only virtual member functions can be marked 'override'}}
22aae5af24f031ad5f17872bd8b27ed5c175c0f90cAnders Carlsson};
23aae5af24f031ad5f17872bd8b27ed5c175c0f90cAnders Carlsson
24aae5af24f031ad5f17872bd8b27ed5c175c0f90cAnders Carlssonstruct C {
25aae5af24f031ad5f17872bd8b27ed5c175c0f90cAnders Carlsson  virtual void f() final;
26aae5af24f031ad5f17872bd8b27ed5c175c0f90cAnders Carlsson  void g() final; // expected-error {{only virtual member functions can be marked 'final'}}
27aae5af24f031ad5f17872bd8b27ed5c175c0f90cAnders Carlsson  int h final; // expected-error {{only virtual member functions can be marked 'final'}}
28aae5af24f031ad5f17872bd8b27ed5c175c0f90cAnders Carlsson};
294867347e82648d3baf09524b98b09c297a5a198fNico Weber
304867347e82648d3baf09524b98b09c297a5a198fNico Webernamespace inline_extension {
314867347e82648d3baf09524b98b09c297a5a198fNico Weber  struct Base1 {
324867347e82648d3baf09524b98b09c297a5a198fNico Weber    virtual void g() {}
334867347e82648d3baf09524b98b09c297a5a198fNico Weber  };
344867347e82648d3baf09524b98b09c297a5a198fNico Weber
354867347e82648d3baf09524b98b09c297a5a198fNico Weber  struct A : Base1 {
364867347e82648d3baf09524b98b09c297a5a198fNico Weber    virtual void g() override override {} // expected-error {{class member already marked 'override'}}
374867347e82648d3baf09524b98b09c297a5a198fNico Weber    virtual void h() final final {} // expected-error {{class member already marked 'final'}}
384867347e82648d3baf09524b98b09c297a5a198fNico Weber  };
394867347e82648d3baf09524b98b09c297a5a198fNico Weber
404867347e82648d3baf09524b98b09c297a5a198fNico Weber  struct Base2 {
414867347e82648d3baf09524b98b09c297a5a198fNico Weber    virtual void f();
424867347e82648d3baf09524b98b09c297a5a198fNico Weber  };
434867347e82648d3baf09524b98b09c297a5a198fNico Weber
444867347e82648d3baf09524b98b09c297a5a198fNico Weber  struct B : Base2 {
454867347e82648d3baf09524b98b09c297a5a198fNico Weber    virtual void f() override {}
464867347e82648d3baf09524b98b09c297a5a198fNico Weber    void g() override {} // expected-error {{only virtual member functions can be marked 'override'}}
474867347e82648d3baf09524b98b09c297a5a198fNico Weber  };
484867347e82648d3baf09524b98b09c297a5a198fNico Weber
494867347e82648d3baf09524b98b09c297a5a198fNico Weber  struct C {
504867347e82648d3baf09524b98b09c297a5a198fNico Weber    virtual void f() final {}
514867347e82648d3baf09524b98b09c297a5a198fNico Weber    void g() final {} // expected-error {{only virtual member functions can be marked 'final'}}
524867347e82648d3baf09524b98b09c297a5a198fNico Weber  };
534867347e82648d3baf09524b98b09c297a5a198fNico Weber}
54