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