Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mono / tests / enum-intrins.cs
1 /*
2  * enum-intrins.cs: Tests for Enum.HasFlag () intrinsic.
3  */
4
5 using System;
6
7 namespace Test {
8
9         enum ByteEnum : byte {
10                 A = 1,
11                 B = 2,
12                 C = 4,
13         }
14
15         enum SByteEnum : sbyte {
16                 A = 1,
17                 B = 2,
18                 C = 4,
19         }
20
21         enum ShortEnum : short {
22                 A = 1,
23                 B = 2,
24                 C = 4,
25         }
26
27         enum UShortEnum : ushort {
28                 A = 1,
29                 B = 2,
30                 C = 4,
31         }
32
33         enum IntEnum : int {
34                 A = 1,
35                 B = 2,
36                 C = 4,
37         }
38
39         enum UIntEnum : uint {
40                 A = 1,
41                 B = 2,
42                 C = 4,
43         }
44
45         enum LongEnum : long {
46                 A = 1,
47                 B = 2,
48                 C = 4,
49         }
50
51         enum ULongEnum : ulong {
52                 A = 1,
53                 B = 2,
54                 C = 4,
55         }
56
57         public class Test {
58
59                 static int TestIntrinsic ()
60                 {
61                         var byteEnum1 = ByteEnum.A | ByteEnum.B;
62                         if (byteEnum1.HasFlag (ByteEnum.C))
63                                 return 1;
64
65                         var byteEnum2 = ByteEnum.A | ByteEnum.C;
66                         if (!byteEnum2.HasFlag (ByteEnum.C))
67                                 return 2;
68
69                         var sbyteEnum1 = SByteEnum.A | SByteEnum.B;
70                         if (sbyteEnum1.HasFlag (SByteEnum.C))
71                                 return 3;
72
73                         var sbyteEnum2 = SByteEnum.A | SByteEnum.C;
74                         if (!sbyteEnum2.HasFlag (SByteEnum.C))
75                                 return 4;
76
77                         var shortEnum1 = ShortEnum.A | ShortEnum.B;
78                         if (shortEnum1.HasFlag (ShortEnum.C))
79                                 return 5;
80
81                         var shortEnum2 = ShortEnum.A | ShortEnum.C;
82                         if (!shortEnum2.HasFlag (ShortEnum.C))
83                                 return 6;
84
85                         var ushortEnum1 = UShortEnum.A | UShortEnum.B;
86                         if (ushortEnum1.HasFlag (UShortEnum.C))
87                                 return 7;
88
89                         var ushortEnum2 = UShortEnum.A | UShortEnum.C;
90                         if (!ushortEnum2.HasFlag (UShortEnum.C))
91                                 return 8;
92
93                         var intEnum1 = IntEnum.A | IntEnum.B;
94                         if (intEnum1.HasFlag (IntEnum.C))
95                                 return 9;
96
97                         var intEnum2 = IntEnum.A | IntEnum.C;
98                         if (!intEnum2.HasFlag (IntEnum.C))
99                                 return 10;
100
101                         var uintEnum1 = UIntEnum.A | UIntEnum.B;
102                         if (uintEnum1.HasFlag (UIntEnum.C))
103                                 return 11;
104
105                         var uintEnum2 = UIntEnum.A | UIntEnum.C;
106                         if (!uintEnum2.HasFlag (UIntEnum.C))
107                                 return 12;
108
109                         var longEnum1 = LongEnum.A | LongEnum.B;
110                         if (longEnum1.HasFlag (LongEnum.C))
111                                 return 13;
112
113                         var longEnum2 = LongEnum.A | LongEnum.C;
114                         if (!longEnum2.HasFlag (LongEnum.C))
115                                 return 14;
116
117                         var ulongEnum1 = ULongEnum.A | ULongEnum.B;
118                         if (ulongEnum1.HasFlag (ULongEnum.C))
119                                 return 15;
120
121                         var ulongEnum2 = ULongEnum.A | ULongEnum.C;
122                         if (!ulongEnum2.HasFlag (ULongEnum.C))
123                                 return 16;
124
125                         return 0;
126                 }
127
128                 static int TestBoxed ()
129                 {
130                         /* The casts to Enum will make the JIT's pattern matching miss the call. */
131
132                         var byteEnum1 = ByteEnum.A | ByteEnum.B;
133                         if (byteEnum1.HasFlag ((Enum)(object) ByteEnum.C))
134                                 return 1;
135
136                         var byteEnum2 = ByteEnum.A | ByteEnum.C;
137                         if (!byteEnum2.HasFlag ((Enum)(object) ByteEnum.C))
138                                 return 2;
139
140                         var sbyteEnum1 = SByteEnum.A | SByteEnum.B;
141                         if (sbyteEnum1.HasFlag ((Enum)(object) SByteEnum.C))
142                                 return 3;
143
144                         var sbyteEnum2 = SByteEnum.A | SByteEnum.C;
145                         if (!sbyteEnum2.HasFlag ((Enum)(object) SByteEnum.C))
146                                 return 4;
147
148                         var shortEnum1 = ShortEnum.A | ShortEnum.B;
149                         if (shortEnum1.HasFlag ((Enum)(object) ShortEnum.C))
150                                 return 5;
151
152                         var shortEnum2 = ShortEnum.A | ShortEnum.C;
153                         if (!shortEnum2.HasFlag ((Enum)(object) ShortEnum.C))
154                                 return 6;
155
156                         var ushortEnum1 = UShortEnum.A | UShortEnum.B;
157                         if (ushortEnum1.HasFlag ((Enum)(object) UShortEnum.C))
158                                 return 7;
159
160                         var ushortEnum2 = UShortEnum.A | UShortEnum.C;
161                         if (!ushortEnum2.HasFlag ((Enum)(object) UShortEnum.C))
162                                 return 8;
163
164                         var intEnum1 = IntEnum.A | IntEnum.B;
165                         if (intEnum1.HasFlag ((Enum)(object) IntEnum.C))
166                                 return 9;
167
168                         var intEnum2 = IntEnum.A | IntEnum.C;
169                         if (!intEnum2.HasFlag ((Enum)(object) IntEnum.C))
170                                 return 10;
171
172                         var uintEnum1 = UIntEnum.A | UIntEnum.B;
173                         if (uintEnum1.HasFlag ((Enum)(object) UIntEnum.C))
174                                 return 11;
175
176                         var uintEnum2 = UIntEnum.A | UIntEnum.C;
177                         if (!uintEnum2.HasFlag ((Enum)(object) UIntEnum.C))
178                                 return 12;
179
180                         var longEnum1 = LongEnum.A | LongEnum.B;
181                         if (longEnum1.HasFlag ((Enum)(object) LongEnum.C))
182                                 return 13;
183
184                         var longEnum2 = LongEnum.A | LongEnum.C;
185                         if (!longEnum2.HasFlag ((Enum)(object) LongEnum.C))
186                                 return 14;
187
188                         var ulongEnum1 = ULongEnum.A | ULongEnum.B;
189                         if (ulongEnum1.HasFlag ((Enum)(object) ULongEnum.C))
190                                 return 15;
191
192                         var ulongEnum2 = ULongEnum.A | ULongEnum.C;
193                         if (!ulongEnum2.HasFlag ((Enum)(object) ULongEnum.C))
194                                 return 16;
195
196                         return 0;
197                 }
198
199                 public static int Main ()
200                 {
201                         int res;
202
203                         if ((res = TestIntrinsic ()) != 0)
204                                 return res;
205
206                         if ((res = TestBoxed ()) != 0)
207                                 return res;
208
209                         return 0;
210                 }
211         }
212 }