1// { dg-do compile { target c++11 } } 2struct B1 {}; 3 4struct B2 final {}; 5 6struct D1 : B1 {}; 7 8struct D2 : B2 {}; // { dg-error "cannot derive from 'final' base" } 9 10template<class T> struct D3 : T {}; 11 12template<class T> struct D4 : T {}; // { dg-error "cannot derive from 'final' base" } 13 14template <class T> struct B3 {}; 15 16template <class T> struct B4 final {}; 17 18template <class T> struct B5 final {}; 19 20struct undeclared<int> final { }; // { dg-error "not a class template" } 21 22struct D5 : B3<D5> {}; 23 24struct D6 : B4<D6> {}; // { dg-error "cannot derive from 'final' base" } 25 26struct B6 final final {}; // { dg-error "duplicate virt-specifier" } 27 28struct B7 override {}; // { dg-error "cannot specify 'override' for a class" } 29 30namespace N 31{ 32 struct C; 33} 34 35struct N::C final{}; 36 37int main() 38{ 39 D3<B1> d; 40 D4<B2> d2; 41 struct B2 final{}; // { dg-error "previous definition" } 42 B2 final; // { dg-error "has a previous declaration|previously declared here" } 43 B2 final2 = final; 44 struct B2 {}; // { dg-error "redefinition" } 45 struct B2 final; // { dg-error "redeclaration" } 46 struct B2 override; // { dg-message "previously declared here" } 47 struct B2 final {}; // { dg-error "redefinition" } 48 struct B2 override {}; // { dg-error "cannot specify 'override' for a class" } 49 B2 override{}; // { dg-error "redeclaration" } 50 struct foo final {}; // { dg-error "previous definition" } 51 struct foo final {}; // { dg-error "redefinition" } 52 foo final; // { dg-error "conflicting declaration" } 53} 54