111
|
1 // { dg-do compile { target c++11 } }
|
|
2
|
|
3 template<typename T> struct S1
|
|
4 {
|
|
5 struct S2
|
|
6 {
|
|
7 // opaque enum declarations
|
|
8 enum class E1;
|
|
9 enum class E2 : T;
|
|
10 enum class E3 : short;
|
|
11 enum E4 : T;
|
|
12 enum E5 : short;
|
|
13
|
|
14 // can be repeated
|
|
15 enum class E1;
|
|
16 enum class E2 : T;
|
|
17 enum class E3 : short;
|
|
18 enum E4 : T;
|
|
19 enum E5 : short;
|
|
20 };
|
|
21
|
|
22 // are complete so we can declare variables
|
|
23 typename S2::E1 b1;
|
|
24 typename S2::E2 b2;
|
|
25 typename S2::E3 b3;
|
|
26 typename S2::E4 b4;
|
|
27 typename S2::E5 b5;
|
|
28
|
|
29 //even with elaborated-type-specifiers
|
|
30 enum S1::S2::E1 a1;
|
|
31 enum S1::S2::E2 a2;
|
|
32 enum S1::S2::E3 a3;
|
|
33 enum S1::S2::E4 a4;
|
|
34 enum S1::S2::E5 a5;
|
|
35
|
|
36 // and the list can be added later
|
|
37 enum class S1::S2::E1 { e11, e12 };
|
|
38 enum class S1::S2::E2 : T { e21, e22 };
|
|
39 enum class S1::S2::E3 : short {e31, e32 };
|
|
40 enum S1::S2::E4 : T { e41, e42 };
|
|
41 enum S1::S2::E5 : short { e51, e52 };
|
|
42 };
|
|
43
|
|
44 template struct S1<int>;
|