1// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s
2
3namespace Test1 {
4
5struct B {
6  virtual void f(int);
7};
8
9struct D : B {
10  virtual void f(long) override; // expected-error {{'f' marked 'override' but does not override any member functions}}
11  void f(int) override;
12};
13}
14
15namespace Test2 {
16
17struct A {
18  virtual void f(int, char, int);
19};
20
21template<typename T>
22struct B : A {
23  // FIXME: Diagnose this.
24  virtual void f(T) override;
25};
26
27template<typename T>
28struct C : A {
29  virtual void f(int) override; // expected-error {{does not override}}
30};
31
32}
33
34namespace Test3 {
35
36struct A {
37  virtual void f(int, char, int);
38};
39
40template<typename... Args>
41struct B : A {
42  virtual void f(Args...) override; // expected-error {{'f' marked 'override' but does not override any member functions}}
43};
44
45template struct B<int, char, int>;
46template struct B<int>; // expected-note {{in instantiation of template class 'Test3::B<int>' requested here}}
47
48}
49
50namespace Test4 {
51struct B {
52  virtual void f() const final; // expected-note {{overridden virtual function is here}}
53};
54
55struct D : B {
56  void f() const; // expected-error {{declaration of 'f' overrides a 'final' function}}
57};
58
59}
60
61namespace PR13499 {
62  struct X {
63    virtual void f();
64    virtual void h();
65  };
66  template<typename T> struct A : X {
67    void f() override;
68    void h() final;
69  };
70  template<typename T> struct B : X {
71    void g() override; // expected-error {{only virtual member functions can be marked 'override'}}
72    void i() final; // expected-error {{only virtual member functions can be marked 'final'}}
73  };
74  B<int> b; // no-note
75  template<typename T> struct C : T {
76    void g() override;
77    void i() final;
78  };
79  template<typename T> struct D : X {
80    virtual void g() override; // expected-error {{does not override}}
81    virtual void i() final;
82  };
83  template<typename...T> struct E : X {
84    void f(T...) override;
85    void g(T...) override; // expected-error {{only virtual member functions can be marked 'override'}}
86    void h(T...) final;
87    void i(T...) final; // expected-error {{only virtual member functions can be marked 'final'}}
88  };
89  // FIXME: Diagnose these in the template definition, not in the instantiation.
90  E<> e; // expected-note {{in instantiation of}}
91
92  template<typename T> struct Y : T {
93    void f() override;
94    void h() final;
95  };
96  template<typename T> struct Z : T {
97    void g() override; // expected-error {{only virtual member functions can be marked 'override'}}
98    void i() final; // expected-error {{only virtual member functions can be marked 'final'}}
99  };
100  Y<X> y;
101  Z<X> z; // expected-note {{in instantiation of}}
102}
103