1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++11
2dfc2f1035d23e294b298766a3cf51dfe249d53a2Anders Carlssonnamespace Test1 {
3dfc2f1035d23e294b298766a3cf51dfe249d53a2Anders Carlsson
4dfc2f1035d23e294b298766a3cf51dfe249d53a2Anders Carlssonclass A final { }; // expected-note {{'A' declared here}}
5dfc2f1035d23e294b298766a3cf51dfe249d53a2Anders Carlssonclass B : A { }; // expected-error {{base 'A' is marked 'final'}}
6dfc2f1035d23e294b298766a3cf51dfe249d53a2Anders Carlsson
7dfc2f1035d23e294b298766a3cf51dfe249d53a2Anders Carlsson}
8dfc2f1035d23e294b298766a3cf51dfe249d53a2Anders Carlsson
97028088b4bce6fa4660232698068d4cc7b0ab698Anders Carlssonnamespace Test2 {
107028088b4bce6fa4660232698068d4cc7b0ab698Anders Carlsson
117028088b4bce6fa4660232698068d4cc7b0ab698Anders Carlssontemplate<typename T> struct A final { }; // expected-note 2 {{'A' declared here}}
127028088b4bce6fa4660232698068d4cc7b0ab698Anders Carlssonstruct B : A<int> { }; // expected-error {{base 'A' is marked 'final'}}
137028088b4bce6fa4660232698068d4cc7b0ab698Anders Carlsson
147028088b4bce6fa4660232698068d4cc7b0ab698Anders Carlssontemplate<typename T> struct C : A<T> { }; // expected-error {{base 'A' is marked 'final'}}
157028088b4bce6fa4660232698068d4cc7b0ab698Anders Carlssonstruct D : C<int> { }; // expected-note {{in instantiation of template class 'Test2::C<int>' requested here}}
167028088b4bce6fa4660232698068d4cc7b0ab698Anders Carlsson
177028088b4bce6fa4660232698068d4cc7b0ab698Anders Carlsson}
187028088b4bce6fa4660232698068d4cc7b0ab698Anders Carlsson
197028088b4bce6fa4660232698068d4cc7b0ab698Anders Carlssonnamespace Test3 {
207028088b4bce6fa4660232698068d4cc7b0ab698Anders Carlsson
217028088b4bce6fa4660232698068d4cc7b0ab698Anders Carlssontemplate<typename T> struct A { };
227028088b4bce6fa4660232698068d4cc7b0ab698Anders Carlssontemplate<> struct A<int> final { }; // expected-note {{'A' declared here}}
237028088b4bce6fa4660232698068d4cc7b0ab698Anders Carlsson
247028088b4bce6fa4660232698068d4cc7b0ab698Anders Carlssonstruct B : A<bool> { };
257028088b4bce6fa4660232698068d4cc7b0ab698Anders Carlssonstruct C : A<int> { }; // expected-error {{base 'A' is marked 'final'}}
267028088b4bce6fa4660232698068d4cc7b0ab698Anders Carlsson
277028088b4bce6fa4660232698068d4cc7b0ab698Anders Carlsson}
287028088b4bce6fa4660232698068d4cc7b0ab698Anders Carlsson
29b6b5b97c517cc651285f620a70b1ca52fa808c5aDavid Blaikienamespace Test4 {
30b6b5b97c517cc651285f620a70b1ca52fa808c5aDavid Blaikie
31b6b5b97c517cc651285f620a70b1ca52fa808c5aDavid Blaikiestruct A final { virtual void func() = 0; }; // expected-warning {{abstract class is marked 'final'}} expected-note {{unimplemented pure virtual method 'func' in 'A'}}
32b6b5b97c517cc651285f620a70b1ca52fa808c5aDavid Blaikiestruct B { virtual void func() = 0; }; // expected-note {{unimplemented pure virtual method 'func' in 'C'}}
33b6b5b97c517cc651285f620a70b1ca52fa808c5aDavid Blaikie
34b6b5b97c517cc651285f620a70b1ca52fa808c5aDavid Blaikiestruct C final : B { }; // expected-warning {{abstract class is marked 'final'}}
35b6b5b97c517cc651285f620a70b1ca52fa808c5aDavid Blaikie
36b6b5b97c517cc651285f620a70b1ca52fa808c5aDavid Blaikie}
37