xref: /llvm-project/clang/test/CXX/class/p2-0x.cpp (revision 348df509a0b7f21c2a274e2f928ba43bc95380d4)
19ca5c425SRichard Smith // RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++11
2fc1eef48SAnders Carlsson namespace Test1 {
3fc1eef48SAnders Carlsson 
4fc1eef48SAnders Carlsson class A final { }; // expected-note {{'A' declared here}}
5fc1eef48SAnders Carlsson class B : A { }; // expected-error {{base 'A' is marked 'final'}}
6fc1eef48SAnders Carlsson 
7fc1eef48SAnders Carlsson }
8fc1eef48SAnders Carlsson 
9c4964a40SAnders Carlsson namespace Test2 {
10c4964a40SAnders Carlsson 
11c4964a40SAnders Carlsson template<typename T> struct A final { }; // expected-note 2 {{'A' declared here}}
12c4964a40SAnders Carlsson struct B : A<int> { }; // expected-error {{base 'A' is marked 'final'}}
13c4964a40SAnders Carlsson 
14c4964a40SAnders Carlsson template<typename T> struct C : A<T> { }; // expected-error {{base 'A' is marked 'final'}}
15c4964a40SAnders Carlsson struct D : C<int> { }; // expected-note {{in instantiation of template class 'Test2::C<int>' requested here}}
16c4964a40SAnders Carlsson 
17c4964a40SAnders Carlsson }
18c4964a40SAnders Carlsson 
19c4964a40SAnders Carlsson namespace Test3 {
20c4964a40SAnders Carlsson 
21c4964a40SAnders Carlsson template<typename T> struct A { };
22c4964a40SAnders Carlsson template<> struct A<int> final { }; // expected-note {{'A' declared here}}
23c4964a40SAnders Carlsson 
24c4964a40SAnders Carlsson struct B : A<bool> { };
25c4964a40SAnders Carlsson struct C : A<int> { }; // expected-error {{base 'A' is marked 'final'}}
26c4964a40SAnders Carlsson 
27c4964a40SAnders Carlsson }
28c4964a40SAnders Carlsson 
29*348df509SDavid Blaikie namespace Test4 {
30*348df509SDavid Blaikie 
31*348df509SDavid Blaikie struct A final { virtual void func() = 0; }; // expected-warning {{abstract class is marked 'final'}} expected-note {{unimplemented pure virtual method 'func' in 'A'}}
32*348df509SDavid Blaikie struct B { virtual void func() = 0; }; // expected-note {{unimplemented pure virtual method 'func' in 'C'}}
33*348df509SDavid Blaikie 
34*348df509SDavid Blaikie struct C final : B { }; // expected-warning {{abstract class is marked 'final'}}
35*348df509SDavid Blaikie 
36*348df509SDavid Blaikie }
37