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