xref: /llvm-project/clang/test/CXX/class.derived/class.virtual/p3-0x.cpp (revision e2e8b0e009a9905b523e1d8bc30c1488fae2f6d7)
19ca5c425SRichard Smith // RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s
2fd835537SAnders Carlsson 
3fa8e5d3dSAnders Carlsson namespace Test1 {
4fa8e5d3dSAnders Carlsson 
5fd835537SAnders Carlsson struct B {
6fd835537SAnders Carlsson   virtual void f(int);
7fd835537SAnders Carlsson };
8fd835537SAnders Carlsson 
9fd835537SAnders Carlsson struct D : B {
10fd835537SAnders Carlsson   virtual void f(long) override; // expected-error {{'f' marked 'override' but does not override any member functions}}
11fd835537SAnders Carlsson   void f(int) override;
12fd835537SAnders Carlsson };
13fa8e5d3dSAnders Carlsson }
14fa8e5d3dSAnders Carlsson 
15fa8e5d3dSAnders Carlsson namespace Test2 {
16fa8e5d3dSAnders Carlsson 
17fa8e5d3dSAnders Carlsson struct A {
18fa8e5d3dSAnders Carlsson   virtual void f(int, char, int);
19fa8e5d3dSAnders Carlsson };
20fa8e5d3dSAnders Carlsson 
21fa8e5d3dSAnders Carlsson template<typename T>
22fa8e5d3dSAnders Carlsson struct B : A {
2318f07db1SRichard Smith   // FIXME: Diagnose this.
24fa8e5d3dSAnders Carlsson   virtual void f(T) override;
25fa8e5d3dSAnders Carlsson };
26fa8e5d3dSAnders Carlsson 
2718f07db1SRichard Smith template<typename T>
2818f07db1SRichard Smith struct C : A {
2918f07db1SRichard Smith   virtual void f(int) override; // expected-error {{does not override}}
3018f07db1SRichard Smith };
3118f07db1SRichard Smith 
32fa8e5d3dSAnders Carlsson }
337c812f5aSAnders Carlsson 
347c812f5aSAnders Carlsson namespace Test3 {
357c812f5aSAnders Carlsson 
367c812f5aSAnders Carlsson struct A {
377c812f5aSAnders Carlsson   virtual void f(int, char, int);
387c812f5aSAnders Carlsson };
397c812f5aSAnders Carlsson 
407c812f5aSAnders Carlsson template<typename... Args>
417c812f5aSAnders Carlsson struct B : A {
427c812f5aSAnders Carlsson   virtual void f(Args...) override; // expected-error {{'f' marked 'override' but does not override any member functions}}
437c812f5aSAnders Carlsson };
447c812f5aSAnders Carlsson 
457c812f5aSAnders Carlsson template struct B<int, char, int>;
467c812f5aSAnders Carlsson template struct B<int>; // expected-note {{in instantiation of template class 'Test3::B<int>' requested here}}
477c812f5aSAnders Carlsson 
487c812f5aSAnders Carlsson }
493f610c75SAnders Carlsson 
503f610c75SAnders Carlsson namespace Test4 {
513f610c75SAnders Carlsson struct B {
523f610c75SAnders Carlsson   virtual void f() const final; // expected-note {{overridden virtual function is here}}
533f610c75SAnders Carlsson };
543f610c75SAnders Carlsson 
553f610c75SAnders Carlsson struct D : B {
563f610c75SAnders Carlsson   void f() const; // expected-error {{declaration of 'f' overrides a 'final' function}}
573f610c75SAnders Carlsson };
583f610c75SAnders Carlsson 
593f610c75SAnders Carlsson }
6018f07db1SRichard Smith 
6118f07db1SRichard Smith namespace PR13499 {
6218f07db1SRichard Smith   struct X {
6318f07db1SRichard Smith     virtual void f();
64*e2e8b0e0SAlexander Potapenko     virtual void h();
6518f07db1SRichard Smith   };
6618f07db1SRichard Smith   template<typename T> struct A : X {
6718f07db1SRichard Smith     void f() override;
6818f07db1SRichard Smith     void h() final;
6918f07db1SRichard Smith   };
7018f07db1SRichard Smith   template<typename T> struct B : X {
7118f07db1SRichard Smith     void g() override; // expected-error {{only virtual member functions can be marked 'override'}}
7218f07db1SRichard Smith     void i() final; // expected-error {{only virtual member functions can be marked 'final'}}
7318f07db1SRichard Smith   };
7418f07db1SRichard Smith   B<int> b; // no-note
7518f07db1SRichard Smith   template<typename T> struct C : T {
7618f07db1SRichard Smith     void g() override;
7718f07db1SRichard Smith     void i() final;
7818f07db1SRichard Smith   };
7918f07db1SRichard Smith   template<typename T> struct D : X {
8018f07db1SRichard Smith     virtual void g() override; // expected-error {{does not override}}
8118f07db1SRichard Smith     virtual void i() final;
8218f07db1SRichard Smith   };
8318f07db1SRichard Smith   template<typename...T> struct E : X {
8418f07db1SRichard Smith     void f(T...) override;
8518f07db1SRichard Smith     void g(T...) override; // expected-error {{only virtual member functions can be marked 'override'}}
86*e2e8b0e0SAlexander Potapenko     void h(T...) final;
8718f07db1SRichard Smith     void i(T...) final; // expected-error {{only virtual member functions can be marked 'final'}}
8818f07db1SRichard Smith   };
8918f07db1SRichard Smith   // FIXME: Diagnose these in the template definition, not in the instantiation.
9018f07db1SRichard Smith   E<> e; // expected-note {{in instantiation of}}
9118f07db1SRichard Smith 
9218f07db1SRichard Smith   template<typename T> struct Y : T {
9318f07db1SRichard Smith     void f() override;
94*e2e8b0e0SAlexander Potapenko     void h() final;
9518f07db1SRichard Smith   };
9618f07db1SRichard Smith   template<typename T> struct Z : T {
9718f07db1SRichard Smith     void g() override; // expected-error {{only virtual member functions can be marked 'override'}}
9818f07db1SRichard Smith     void i() final; // expected-error {{only virtual member functions can be marked 'final'}}
9918f07db1SRichard Smith   };
100*e2e8b0e0SAlexander Potapenko   Y<X> y;
10118f07db1SRichard Smith   Z<X> z; // expected-note {{in instantiation of}}
10218f07db1SRichard Smith }
103d80b2d57SRichard Smith 
104d80b2d57SRichard Smith namespace MemberOfUnknownSpecialization {
105d80b2d57SRichard Smith   template<typename T> struct A {
106d80b2d57SRichard Smith     struct B {};
107d80b2d57SRichard Smith     struct C : B {
108d80b2d57SRichard Smith       void f() override;
109d80b2d57SRichard Smith     };
110d80b2d57SRichard Smith   };
111d80b2d57SRichard Smith 
112d80b2d57SRichard Smith   template<> struct A<int>::B {
113d80b2d57SRichard Smith     virtual void f();
114d80b2d57SRichard Smith   };
115d80b2d57SRichard Smith   // ok
116d80b2d57SRichard Smith   A<int>::C c1;
117d80b2d57SRichard Smith 
118d80b2d57SRichard Smith   template<> struct A<char>::B {
119d80b2d57SRichard Smith     void f();
120d80b2d57SRichard Smith   };
121d80b2d57SRichard Smith   // expected-error@-13 {{only virtual member functions can be marked 'override'}}
122d80b2d57SRichard Smith   // expected-note@+1 {{in instantiation of}}
123d80b2d57SRichard Smith   A<char>::C c2;
124d80b2d57SRichard Smith 
125d80b2d57SRichard Smith   template<> struct A<double>::B {
126d80b2d57SRichard Smith     virtual void f() final;
127d80b2d57SRichard Smith   };
128d80b2d57SRichard Smith   // expected-error@-20 {{declaration of 'f' overrides a 'final' function}}
129d80b2d57SRichard Smith   // expected-note@-3 {{here}}
130d80b2d57SRichard Smith   // expected-note@+1 {{in instantiation of}}
131d80b2d57SRichard Smith   A<double>::C c3;
132d80b2d57SRichard Smith }
133af65120bSEli Friedman 
134af65120bSEli Friedman namespace DiagnosticsQOI {
135af65120bSEli Friedman   struct X {
136af65120bSEli Friedman     virtual ~X();
137af65120bSEli Friedman     virtual void foo(int x); // expected-note {{hidden overloaded virtual function}}
138af65120bSEli Friedman     virtual void bar(int x); // expected-note 2 {{hidden overloaded virtual function}}
139af65120bSEli Friedman     virtual void bar(float x); // expected-note 2 {{hidden overloaded virtual function}}
140af65120bSEli Friedman   };
141af65120bSEli Friedman 
142af65120bSEli Friedman   struct Y : X {
143af65120bSEli Friedman     void foo(int x, int y) override; // expected-error {{non-virtual member function marked 'override' hides virtual member function}}
144af65120bSEli Friedman     void bar(double) override; // expected-error {{non-virtual member function marked 'override' hides virtual member functions}}
145af65120bSEli Friedman     void bar(long double) final; // expected-error {{non-virtual member function marked 'final' hides virtual member functions}}
146af65120bSEli Friedman   };
147af65120bSEli Friedman 
148af65120bSEli Friedman   template<typename T>
149af65120bSEli Friedman   struct Z : T {
150af65120bSEli Friedman     static void foo() override; // expected-error {{only virtual member functions can be marked 'override'}}
151af65120bSEli Friedman   };
152af65120bSEli Friedman }
153