1 // This testcase checks whether SWIG produces the correct wrappers for strongly typed enums.
2 
3 %module cpp11_strongly_typed_enumerations
4 
5 %warnfilter(SWIGWARN_PARSE_NAMED_NESTED_CLASS) Class1::Struct1;
6 %warnfilter(SWIGWARN_PARSE_NAMED_NESTED_CLASS) Class2::Struct1;
7 
8 /* Forward declarations (illegally accepted by SWIG - oh well!) */
9 enum Enum1 : short;
10 enum Enum3;
11 enum ;
12 enum : unsigned short;
13 
14 %inline %{
15 enum class Enum1 {
16   Val1,
17   Val2,
18   Val3 = 13,
19   Val4,
20   Val5a = 13,
21   Val6a
22 };
23 
24 enum class Enum2 : short {
25   Val1,
26   Val2,
27   Val3 = 23,
28   Val4,
29   Val5b = 23,
30   Val6b
31 };
32 %}
33 
34 // SWIG should fail this one
35 enum Enum2 : unsigned short;     // Illegal in C++11, because Enum2 was previously declared with a different type.
36 
37 %inline %{
38 /* Forward declarations. */
39 enum Enum4 : unsigned int;       // Legal in C++11.
40 enum class Enum5;                // Legal in C++11, because enum class declarations have a default type of "int".
41 enum class Enum6 : unsigned int; // Legal C++11.
42 
43 enum Enum4 : unsigned int {
44   Val1, Val2, Val3 = 43, Val4
45 };
46 
47 enum class Enum5 {
48   Val1, Val2, Val3 = 53, Val4
49 };
50 
51 enum class Enum6 : unsigned int {
52   Val1, Val2, Val3 = 63, Val4
53 };
54 
55 typedef enum class Enum7 : unsigned int {
56   Val1, Val2, Val3 = 73, Val4
57 } Enum7td;
58 
59 // enum inherits from non-primitive type
60 enum class Enum8 : size_t {
61   Val1, Val2, Val3 = 83, Val4
62 };
63 
64 template <typename T> struct TType {
65   typedef T type_name;
66 };
67 
68 enum class Enum10 : TType<int>::type_name {
69   Val1, Val2, Val3 = 103, Val4
70 };
71 
72 // forward declaration, no definition of enum
73 enum class Enum11 : int;
74 struct UseEnum11 {
75     Enum11 myenum11;
76 };
77 
78 class Class1
79 {
80 public:
81   enum class Enum12
82   {
83     Val1 = 1121,
84     Val2 = 1122,
85     Val3,
86     Val4,
87     Val5c = 1121,
88     Val6c
89   };
90 
91   enum Enum13
92   {
93     Val1 = 1131,
94     Val2 = 1132,
95     Val3,
96     Val4,
97     Val5d = 1131,
98     Val6d
99   };
100 
101   enum class Enum14
102   {
103     Val1 = 1141,
104     Val2 = 1142,
105     Val3,
106     Val4,
107     Val5e = 1141,
108     Val6e
109   };
110 
111   struct Struct1
112   {
113     enum class Enum12
114     {
115       Val1 = 3121,
116       Val2 = 3122,
117       Val3,
118       Val4,
119       Val5f = 3121,
120       Val6f
121     };
122 
123     enum Enum13
124     {
125       Val1 = 3131,
126       Val2 = 3132,
127       Val3,
128       Val4,
129     };
130 
131     enum class Enum14
132     {
133       Val1 = 3141,
134       Val2 = 3142,
135       Val3,
136       Val4,
137       Val5g = 3141,
138       Val6g
139     };
140   };
class1Test1(Enum1 e)141   Enum1 class1Test1(Enum1 e) { return e; }
class1Test2(Enum12 e)142   Enum12 class1Test2(Enum12 e) { return e; }
class1Test3(Struct1::Enum12 e)143   Struct1::Enum12 class1Test3(Struct1::Enum12 e) { return e; }
144 };
145 
146 class Class2
147 {
148 public:
149   enum class Enum12
150   {
151     Val1 = 2121,
152     Val2 = 2122,
153     Val3,
154     Val4,
155     Val5h = 2121,
156     Val6h
157   };
158 
159   enum Enum13
160   {
161     Val1 = 2131,
162     Val2 = 2132,
163     Val3,
164     Val4,
165     Val5i = 2131,
166     Val6i
167   };
168 
169   enum class Enum14
170   {
171     Val1 = 2141,
172     Val2 = 2142,
173     Val3,
174     Val4,
175     Val5j = 2141,
176     Val6j
177   };
178 
179   struct Struct1
180   {
181     enum class Enum12
182     {
183       Val1 = 4121,
184       Val2 = 4122,
185       Val3,
186       Val4,
187       Val5k = 4121,
188       Val6k
189     };
190 
191     enum Enum13
192     {
193       Val1 = 4131,
194       Val2 = 4132,
195       Val3,
196       Val4,
197       Val5l = 4131,
198       Val6l
199     };
200 
201     enum class Enum14
202     {
203       Val1 = 4141,
204       Val2 = 4142,
205       Val3,
206       Val4,
207       Val5m = 4141,
208       Val6m
209     };
210   };
211 };
212 
globalTest1(Enum1 e)213 Enum1 globalTest1(Enum1 e) { return e; }
globalTest2(Class1::Enum12 e)214 Class1::Enum12 globalTest2(Class1::Enum12 e) { return e; }
globalTest3(Class1::Struct1::Enum12 e)215 Class1::Struct1::Enum12 globalTest3(Class1::Struct1::Enum12 e) { return e; }
216 
217 class PrivateEnumClass {
218 private:
219   enum class Enum {
220     PrivateEnum1,
221     PrivateEnum2
222   };
223 };
224 %}
225 
226