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