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