1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s
29e682d9f567a51f26c3b0673837e23bafdb09c11Anders Carlsson
33ffe183448af7c543a208dd3313a49c83a3ad53eAnders Carlssonnamespace Test1 {
43ffe183448af7c543a208dd3313a49c83a3ad53eAnders Carlsson
59e682d9f567a51f26c3b0673837e23bafdb09c11Anders Carlssonstruct B {
69e682d9f567a51f26c3b0673837e23bafdb09c11Anders Carlsson  virtual void f(int);
79e682d9f567a51f26c3b0673837e23bafdb09c11Anders Carlsson};
89e682d9f567a51f26c3b0673837e23bafdb09c11Anders Carlsson
99e682d9f567a51f26c3b0673837e23bafdb09c11Anders Carlssonstruct D : B {
109e682d9f567a51f26c3b0673837e23bafdb09c11Anders Carlsson  virtual void f(long) override; // expected-error {{'f' marked 'override' but does not override any member functions}}
119e682d9f567a51f26c3b0673837e23bafdb09c11Anders Carlsson  void f(int) override;
129e682d9f567a51f26c3b0673837e23bafdb09c11Anders Carlsson};
133ffe183448af7c543a208dd3313a49c83a3ad53eAnders Carlsson}
143ffe183448af7c543a208dd3313a49c83a3ad53eAnders Carlsson
153ffe183448af7c543a208dd3313a49c83a3ad53eAnders Carlssonnamespace Test2 {
163ffe183448af7c543a208dd3313a49c83a3ad53eAnders Carlsson
173ffe183448af7c543a208dd3313a49c83a3ad53eAnders Carlssonstruct A {
183ffe183448af7c543a208dd3313a49c83a3ad53eAnders Carlsson  virtual void f(int, char, int);
193ffe183448af7c543a208dd3313a49c83a3ad53eAnders Carlsson};
203ffe183448af7c543a208dd3313a49c83a3ad53eAnders Carlsson
213ffe183448af7c543a208dd3313a49c83a3ad53eAnders Carlssontemplate<typename T>
223ffe183448af7c543a208dd3313a49c83a3ad53eAnders Carlssonstruct B : A {
23a4b39658673954fb9f75673594b50028685fc665Richard Smith  // FIXME: Diagnose this.
243ffe183448af7c543a208dd3313a49c83a3ad53eAnders Carlsson  virtual void f(T) override;
253ffe183448af7c543a208dd3313a49c83a3ad53eAnders Carlsson};
263ffe183448af7c543a208dd3313a49c83a3ad53eAnders Carlsson
27a4b39658673954fb9f75673594b50028685fc665Richard Smithtemplate<typename T>
28a4b39658673954fb9f75673594b50028685fc665Richard Smithstruct C : A {
29a4b39658673954fb9f75673594b50028685fc665Richard Smith  virtual void f(int) override; // expected-error {{does not override}}
30a4b39658673954fb9f75673594b50028685fc665Richard Smith};
31a4b39658673954fb9f75673594b50028685fc665Richard Smith
323ffe183448af7c543a208dd3313a49c83a3ad53eAnders Carlsson}
339eefa229dfb71400a6bbee326420a7f0e2e91f1fAnders Carlsson
349eefa229dfb71400a6bbee326420a7f0e2e91f1fAnders Carlssonnamespace Test3 {
359eefa229dfb71400a6bbee326420a7f0e2e91f1fAnders Carlsson
369eefa229dfb71400a6bbee326420a7f0e2e91f1fAnders Carlssonstruct A {
379eefa229dfb71400a6bbee326420a7f0e2e91f1fAnders Carlsson  virtual void f(int, char, int);
389eefa229dfb71400a6bbee326420a7f0e2e91f1fAnders Carlsson};
399eefa229dfb71400a6bbee326420a7f0e2e91f1fAnders Carlsson
409eefa229dfb71400a6bbee326420a7f0e2e91f1fAnders Carlssontemplate<typename... Args>
419eefa229dfb71400a6bbee326420a7f0e2e91f1fAnders Carlssonstruct B : A {
429eefa229dfb71400a6bbee326420a7f0e2e91f1fAnders Carlsson  virtual void f(Args...) override; // expected-error {{'f' marked 'override' but does not override any member functions}}
439eefa229dfb71400a6bbee326420a7f0e2e91f1fAnders Carlsson};
449eefa229dfb71400a6bbee326420a7f0e2e91f1fAnders Carlsson
459eefa229dfb71400a6bbee326420a7f0e2e91f1fAnders Carlssontemplate struct B<int, char, int>;
469eefa229dfb71400a6bbee326420a7f0e2e91f1fAnders Carlssontemplate struct B<int>; // expected-note {{in instantiation of template class 'Test3::B<int>' requested here}}
479eefa229dfb71400a6bbee326420a7f0e2e91f1fAnders Carlsson
489eefa229dfb71400a6bbee326420a7f0e2e91f1fAnders Carlsson}
492e1c730167d2b978c66558c029d163ffe64b9656Anders Carlsson
502e1c730167d2b978c66558c029d163ffe64b9656Anders Carlssonnamespace Test4 {
512e1c730167d2b978c66558c029d163ffe64b9656Anders Carlssonstruct B {
522e1c730167d2b978c66558c029d163ffe64b9656Anders Carlsson  virtual void f() const final; // expected-note {{overridden virtual function is here}}
532e1c730167d2b978c66558c029d163ffe64b9656Anders Carlsson};
542e1c730167d2b978c66558c029d163ffe64b9656Anders Carlsson
552e1c730167d2b978c66558c029d163ffe64b9656Anders Carlssonstruct D : B {
562e1c730167d2b978c66558c029d163ffe64b9656Anders Carlsson  void f() const; // expected-error {{declaration of 'f' overrides a 'final' function}}
572e1c730167d2b978c66558c029d163ffe64b9656Anders Carlsson};
582e1c730167d2b978c66558c029d163ffe64b9656Anders Carlsson
592e1c730167d2b978c66558c029d163ffe64b9656Anders Carlsson}
60a4b39658673954fb9f75673594b50028685fc665Richard Smith
61a4b39658673954fb9f75673594b50028685fc665Richard Smithnamespace PR13499 {
62a4b39658673954fb9f75673594b50028685fc665Richard Smith  struct X {
63a4b39658673954fb9f75673594b50028685fc665Richard Smith    virtual void f();
64a4b39658673954fb9f75673594b50028685fc665Richard Smith    virtual void h();
65a4b39658673954fb9f75673594b50028685fc665Richard Smith  };
66a4b39658673954fb9f75673594b50028685fc665Richard Smith  template<typename T> struct A : X {
67a4b39658673954fb9f75673594b50028685fc665Richard Smith    void f() override;
68a4b39658673954fb9f75673594b50028685fc665Richard Smith    void h() final;
69a4b39658673954fb9f75673594b50028685fc665Richard Smith  };
70a4b39658673954fb9f75673594b50028685fc665Richard Smith  template<typename T> struct B : X {
71a4b39658673954fb9f75673594b50028685fc665Richard Smith    void g() override; // expected-error {{only virtual member functions can be marked 'override'}}
72a4b39658673954fb9f75673594b50028685fc665Richard Smith    void i() final; // expected-error {{only virtual member functions can be marked 'final'}}
73a4b39658673954fb9f75673594b50028685fc665Richard Smith  };
74a4b39658673954fb9f75673594b50028685fc665Richard Smith  B<int> b; // no-note
75a4b39658673954fb9f75673594b50028685fc665Richard Smith  template<typename T> struct C : T {
76a4b39658673954fb9f75673594b50028685fc665Richard Smith    void g() override;
77a4b39658673954fb9f75673594b50028685fc665Richard Smith    void i() final;
78a4b39658673954fb9f75673594b50028685fc665Richard Smith  };
79a4b39658673954fb9f75673594b50028685fc665Richard Smith  template<typename T> struct D : X {
80a4b39658673954fb9f75673594b50028685fc665Richard Smith    virtual void g() override; // expected-error {{does not override}}
81a4b39658673954fb9f75673594b50028685fc665Richard Smith    virtual void i() final;
82a4b39658673954fb9f75673594b50028685fc665Richard Smith  };
83a4b39658673954fb9f75673594b50028685fc665Richard Smith  template<typename...T> struct E : X {
84a4b39658673954fb9f75673594b50028685fc665Richard Smith    void f(T...) override;
85a4b39658673954fb9f75673594b50028685fc665Richard Smith    void g(T...) override; // expected-error {{only virtual member functions can be marked 'override'}}
86a4b39658673954fb9f75673594b50028685fc665Richard Smith    void h(T...) final;
87a4b39658673954fb9f75673594b50028685fc665Richard Smith    void i(T...) final; // expected-error {{only virtual member functions can be marked 'final'}}
88a4b39658673954fb9f75673594b50028685fc665Richard Smith  };
89a4b39658673954fb9f75673594b50028685fc665Richard Smith  // FIXME: Diagnose these in the template definition, not in the instantiation.
90a4b39658673954fb9f75673594b50028685fc665Richard Smith  E<> e; // expected-note {{in instantiation of}}
91a4b39658673954fb9f75673594b50028685fc665Richard Smith
92a4b39658673954fb9f75673594b50028685fc665Richard Smith  template<typename T> struct Y : T {
93a4b39658673954fb9f75673594b50028685fc665Richard Smith    void f() override;
94a4b39658673954fb9f75673594b50028685fc665Richard Smith    void h() final;
95a4b39658673954fb9f75673594b50028685fc665Richard Smith  };
96a4b39658673954fb9f75673594b50028685fc665Richard Smith  template<typename T> struct Z : T {
97a4b39658673954fb9f75673594b50028685fc665Richard Smith    void g() override; // expected-error {{only virtual member functions can be marked 'override'}}
98a4b39658673954fb9f75673594b50028685fc665Richard Smith    void i() final; // expected-error {{only virtual member functions can be marked 'final'}}
99a4b39658673954fb9f75673594b50028685fc665Richard Smith  };
100a4b39658673954fb9f75673594b50028685fc665Richard Smith  Y<X> y;
101a4b39658673954fb9f75673594b50028685fc665Richard Smith  Z<X> z; // expected-note {{in instantiation of}}
102a4b39658673954fb9f75673594b50028685fc665Richard Smith}
103f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smith
104f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smithnamespace MemberOfUnknownSpecialization {
105f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smith  template<typename T> struct A {
106f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smith    struct B {};
107f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smith    struct C : B {
108f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smith      void f() override;
109f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smith    };
110f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smith  };
111f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smith
112f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smith  template<> struct A<int>::B {
113f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smith    virtual void f();
114f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smith  };
115f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smith  // ok
116f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smith  A<int>::C c1;
117f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smith
118f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smith  template<> struct A<char>::B {
119f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smith    void f();
120f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smith  };
121f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smith  // expected-error@-13 {{only virtual member functions can be marked 'override'}}
122f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smith  // expected-note@+1 {{in instantiation of}}
123f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smith  A<char>::C c2;
124f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smith
125f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smith  template<> struct A<double>::B {
126f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smith    virtual void f() final;
127f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smith  };
128f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smith  // expected-error@-20 {{declaration of 'f' overrides a 'final' function}}
129f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smith  // expected-note@-3 {{here}}
130f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smith  // expected-note@+1 {{in instantiation of}}
131f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smith  A<double>::C c3;
132f62c690c55fb920f3ba0a4f6e6e259e2ae7ce297Richard Smith}
133dae9271c2c32527fea8b01953912e214eadc548eEli Friedman
134dae9271c2c32527fea8b01953912e214eadc548eEli Friedmannamespace DiagnosticsQOI {
135dae9271c2c32527fea8b01953912e214eadc548eEli Friedman  struct X {
136dae9271c2c32527fea8b01953912e214eadc548eEli Friedman    virtual ~X();
137dae9271c2c32527fea8b01953912e214eadc548eEli Friedman    virtual void foo(int x); // expected-note {{hidden overloaded virtual function}}
138dae9271c2c32527fea8b01953912e214eadc548eEli Friedman    virtual void bar(int x); // expected-note 2 {{hidden overloaded virtual function}}
139dae9271c2c32527fea8b01953912e214eadc548eEli Friedman    virtual void bar(float x); // expected-note 2 {{hidden overloaded virtual function}}
140dae9271c2c32527fea8b01953912e214eadc548eEli Friedman  };
141dae9271c2c32527fea8b01953912e214eadc548eEli Friedman
142dae9271c2c32527fea8b01953912e214eadc548eEli Friedman  struct Y : X {
143dae9271c2c32527fea8b01953912e214eadc548eEli Friedman    void foo(int x, int y) override; // expected-error {{non-virtual member function marked 'override' hides virtual member function}}
144dae9271c2c32527fea8b01953912e214eadc548eEli Friedman    void bar(double) override; // expected-error {{non-virtual member function marked 'override' hides virtual member functions}}
145dae9271c2c32527fea8b01953912e214eadc548eEli Friedman    void bar(long double) final; // expected-error {{non-virtual member function marked 'final' hides virtual member functions}}
146dae9271c2c32527fea8b01953912e214eadc548eEli Friedman  };
147dae9271c2c32527fea8b01953912e214eadc548eEli Friedman
148dae9271c2c32527fea8b01953912e214eadc548eEli Friedman  template<typename T>
149dae9271c2c32527fea8b01953912e214eadc548eEli Friedman  struct Z : T {
150dae9271c2c32527fea8b01953912e214eadc548eEli Friedman    static void foo() override; // expected-error {{only virtual member functions can be marked 'override'}}
151dae9271c2c32527fea8b01953912e214eadc548eEli Friedman  };
152dae9271c2c32527fea8b01953912e214eadc548eEli Friedman}
153