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