2 Copyright (c) 2008 KJK::Hyperion
4 Permission is hereby granted, free of charge, to any person obtaining a
5 copy of this software and associated documentation files (the "Software"),
6 to deal in the Software without restriction, including without limitation
7 the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 and/or sell copies of the Software, and to permit persons to whom the
9 Software is furnished to do so, subject to the following conditions:
11 The above copyright notice and this permission notice shall be included in
12 all copies or substantial portions of the Software.
14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20 DEALINGS IN THE SOFTWARE.
23 #include <pseh/pseh2.h>
26 #include <wine/test.h>
28 extern void no_op(void);
29 extern int return_arg(int);
31 extern int return_zero(void);
32 extern int return_positive(void);
33 extern int return_negative(void);
34 extern int return_one(void);
35 extern int return_minusone(void);
37 extern int return_zero_2(void *);
38 extern int return_positive_2(void *);
39 extern int return_negative_2(void *);
40 extern int return_one_2(void *);
41 extern int return_minusone_2(void *);
43 extern int return_zero_3(int);
44 extern int return_positive_3(int);
45 extern int return_negative_3(int);
46 extern int return_one_3(int);
47 extern int return_minusone_3(int);
49 extern int return_zero_4(void *, int);
50 extern int return_positive_4(void *, int);
51 extern int return_negative_4(void *, int);
52 extern int return_one_4(void *, int);
53 extern int return_minusone_4(void *, int);
55 extern void set_positive(int *);
57 static int call_test(int (*)(void));
59 #define DEFINE_TEST(NAME_) static int NAME_(void)
61 /* Empty statements *///{{{
62 DEFINE_TEST(test_empty_1
)
64 _SEH2_TRY
{ } _SEH2_EXCEPT(0) { } _SEH2_END
;
68 DEFINE_TEST(test_empty_2
)
70 _SEH2_TRY
{ } _SEH2_EXCEPT(-1) { } _SEH2_END
;
74 DEFINE_TEST(test_empty_3
)
76 _SEH2_TRY
{ } _SEH2_EXCEPT(1) { } _SEH2_END
;
80 DEFINE_TEST(test_empty_4
)
82 _SEH2_TRY
{ } _SEH2_FINALLY
{ } _SEH2_END
;
86 DEFINE_TEST(test_empty_5
)
88 _SEH2_TRY
{ _SEH2_TRY
{ } _SEH2_EXCEPT(0) { } _SEH2_END
; } _SEH2_FINALLY
{ } _SEH2_END
;
92 DEFINE_TEST(test_empty_6
)
94 _SEH2_TRY
{ _SEH2_TRY
{ } _SEH2_EXCEPT(-1) { } _SEH2_END
; } _SEH2_FINALLY
{ } _SEH2_END
;
98 DEFINE_TEST(test_empty_7
)
100 _SEH2_TRY
{ _SEH2_TRY
{ } _SEH2_EXCEPT(1) { } _SEH2_END
; } _SEH2_FINALLY
{ } _SEH2_END
;
104 DEFINE_TEST(test_empty_8
)
106 _SEH2_TRY
{ _SEH2_TRY
{ } _SEH2_FINALLY
{ } _SEH2_END
; } _SEH2_FINALLY
{ } _SEH2_END
;
111 /* Static exception filters *///{{{
112 DEFINE_TEST(test_execute_handler_1
)
120 RaiseException(0xE00DEAD0, 0, 0, NULL
);
123 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
125 ret
= return_positive();
129 return ret
== return_positive();
132 DEFINE_TEST(test_continue_execution_1
)
140 RaiseException(0xE00DEAD0, 0, 0, NULL
);
141 ret
= return_positive();
143 _SEH2_EXCEPT(EXCEPTION_CONTINUE_EXECUTION
)
149 return ret
== return_positive();
152 DEFINE_TEST(test_continue_search_1
)
162 RaiseException(0xE00DEAD0, 0, 0, NULL
);
165 _SEH2_EXCEPT(EXCEPTION_CONTINUE_SEARCH
)
171 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
173 ret
= return_positive();
177 return ret
== return_positive();
180 DEFINE_TEST(test_execute_handler_2
)
188 RaiseException(0xE00DEAD0, 0, 0, NULL
);
193 ret
= return_positive();
197 return ret
== return_positive();
200 DEFINE_TEST(test_continue_execution_2
)
208 RaiseException(0xE00DEAD0, 0, 0, NULL
);
209 ret
= return_positive();
217 return ret
== return_positive();
221 /* Dynamic exception filters *///{{{
222 DEFINE_TEST(test_execute_handler_3
)
230 RaiseException(0xE00DEAD0, 0, 0, NULL
);
233 _SEH2_EXCEPT(return_one())
235 ret
= return_positive();
239 return ret
== return_positive();
242 DEFINE_TEST(test_continue_execution_3
)
250 RaiseException(0xE00DEAD0, 0, 0, NULL
);
251 ret
= return_positive();
253 _SEH2_EXCEPT(return_minusone())
259 return ret
== return_positive();
262 DEFINE_TEST(test_continue_search_2
)
272 RaiseException(0xE00DEAD0, 0, 0, NULL
);
275 _SEH2_EXCEPT(return_zero())
281 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
283 ret
= return_positive();
287 return ret
== return_positive();
290 DEFINE_TEST(test_execute_handler_4
)
298 RaiseException(0xE00DEAD0, 0, 0, NULL
);
301 _SEH2_EXCEPT(return_positive())
303 ret
= return_positive();
307 return ret
== return_positive();
310 DEFINE_TEST(test_continue_execution_4
)
318 RaiseException(0xE00DEAD0, 0, 0, NULL
);
319 ret
= return_positive();
321 _SEH2_EXCEPT(return_negative())
327 return ret
== return_positive();
331 /* Dynamic exception filters, using _SEH2_GetExceptionInformation() *///{{{
332 DEFINE_TEST(test_execute_handler_5
)
340 RaiseException(0xE00DEAD0, 0, 0, NULL
);
343 _SEH2_EXCEPT(return_one_2(_SEH2_GetExceptionInformation()))
345 ret
= return_positive();
349 return ret
== return_positive();
352 DEFINE_TEST(test_continue_execution_5
)
360 RaiseException(0xE00DEAD0, 0, 0, NULL
);
361 ret
= return_positive();
363 _SEH2_EXCEPT(return_minusone_2(_SEH2_GetExceptionInformation()))
369 return ret
== return_positive();
372 DEFINE_TEST(test_continue_search_3
)
376 ret
= return_positive();
382 RaiseException(0xE00DEAD0, 0, 0, NULL
);
385 _SEH2_EXCEPT(return_zero_2(_SEH2_GetExceptionInformation()))
391 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
393 ret
= return_arg(ret
);
397 return ret
== return_positive();
400 DEFINE_TEST(test_execute_handler_6
)
408 RaiseException(0xE00DEAD0, 0, 0, NULL
);
411 _SEH2_EXCEPT(return_positive_2(_SEH2_GetExceptionInformation()))
413 ret
= return_positive();
417 return ret
== return_positive();
420 DEFINE_TEST(test_continue_execution_6
)
428 RaiseException(0xE00DEAD0, 0, 0, NULL
);
429 ret
= return_positive();
431 _SEH2_EXCEPT(return_negative_2(_SEH2_GetExceptionInformation()))
437 return ret
== return_positive();
441 /* Dynamic exception filters, using _SEH2_GetExceptionCode() *///{{{
442 DEFINE_TEST(test_execute_handler_7
)
450 RaiseException(0xE00DEAD0, 0, 0, NULL
);
453 _SEH2_EXCEPT(return_one_3(_SEH2_GetExceptionCode()))
455 ret
= return_positive();
459 return ret
== return_positive();
462 DEFINE_TEST(test_continue_execution_7
)
470 RaiseException(0xE00DEAD0, 0, 0, NULL
);
471 ret
= return_positive();
473 _SEH2_EXCEPT(return_minusone_3(_SEH2_GetExceptionCode()))
479 return ret
== return_positive();
482 DEFINE_TEST(test_continue_search_4
)
492 RaiseException(0xE00DEAD0, 0, 0, NULL
);
495 _SEH2_EXCEPT(return_zero_3(_SEH2_GetExceptionCode()))
501 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
503 ret
= return_positive();
507 return ret
== return_positive();
510 DEFINE_TEST(test_execute_handler_8
)
518 RaiseException(0xE00DEAD0, 0, 0, NULL
);
521 _SEH2_EXCEPT(return_positive_3(_SEH2_GetExceptionCode()))
523 ret
= return_positive();
527 return ret
== return_positive();
530 DEFINE_TEST(test_continue_execution_8
)
538 RaiseException(0xE00DEAD0, 0, 0, NULL
);
539 ret
= return_positive();
541 _SEH2_EXCEPT(return_negative_3(_SEH2_GetExceptionCode()))
547 return ret
== return_positive();
551 /* Dynamic exception filters, using _SEH2_GetExceptionInformation() and _SEH2_GetExceptionCode() *///{{{
552 DEFINE_TEST(test_execute_handler_9
)
560 RaiseException(0xE00DEAD0, 0, 0, NULL
);
563 _SEH2_EXCEPT(return_one_4(_SEH2_GetExceptionInformation(), _SEH2_GetExceptionCode()))
565 ret
= return_positive();
569 return ret
== return_positive();
572 DEFINE_TEST(test_continue_execution_9
)
580 RaiseException(0xE00DEAD0, 0, 0, NULL
);
581 ret
= return_positive();
583 _SEH2_EXCEPT(return_minusone_4(_SEH2_GetExceptionInformation(), _SEH2_GetExceptionCode()))
589 return ret
== return_positive();
592 DEFINE_TEST(test_continue_search_5
)
602 RaiseException(0xE00DEAD0, 0, 0, NULL
);
605 _SEH2_EXCEPT(return_zero_4(_SEH2_GetExceptionInformation(), _SEH2_GetExceptionCode()))
611 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
613 ret
= return_positive();
617 return ret
== return_positive();
620 DEFINE_TEST(test_execute_handler_10
)
628 RaiseException(0xE00DEAD0, 0, 0, NULL
);
631 _SEH2_EXCEPT(return_positive_4(_SEH2_GetExceptionInformation(), _SEH2_GetExceptionCode()))
633 ret
= return_positive();
637 return ret
== return_positive();
640 DEFINE_TEST(test_continue_execution_10
)
648 RaiseException(0xE00DEAD0, 0, 0, NULL
);
649 ret
= return_positive();
651 _SEH2_EXCEPT(return_negative_4(_SEH2_GetExceptionInformation(), _SEH2_GetExceptionCode()))
657 return ret
== return_positive();
661 /* Constant exception filters with side effects *///{{{
662 DEFINE_TEST(test_execute_handler_11
)
670 RaiseException(0xE00DEAD0, 0, 0, NULL
);
673 _SEH2_EXCEPT(set_positive(&ret
), EXCEPTION_EXECUTE_HANDLER
)
675 ret
= ret
? return_positive() : return_zero();
679 return ret
== return_positive();
682 DEFINE_TEST(test_continue_execution_11
)
690 RaiseException(0xE00DEAD0, 0, 0, NULL
);
691 ret
= ret
? return_positive() : return_zero();
693 _SEH2_EXCEPT(set_positive(&ret
), EXCEPTION_CONTINUE_EXECUTION
)
699 return ret
== return_positive();
702 DEFINE_TEST(test_continue_search_6
)
708 ret2
= return_zero();
714 RaiseException(0xE00DEAD0, 0, 0, NULL
);
716 ret2
= return_zero();
718 _SEH2_EXCEPT(set_positive(&ret
), EXCEPTION_CONTINUE_SEARCH
)
721 ret2
= return_zero();
725 _SEH2_EXCEPT(set_positive(&ret2
), EXCEPTION_EXECUTE_HANDLER
)
727 ret
= return_arg(ret
);
728 ret2
= return_arg(ret2
);
732 return ret
== return_positive() && ret2
== return_positive();
735 DEFINE_TEST(test_execute_handler_12
)
743 RaiseException(0xE00DEAD0, 0, 0, NULL
);
746 _SEH2_EXCEPT(set_positive(&ret
), 12345)
748 ret
= return_arg(ret
);
752 return ret
== return_positive();
755 DEFINE_TEST(test_continue_execution_12
)
763 RaiseException(0xE00DEAD0, 0, 0, NULL
);
764 ret
= return_arg(ret
);
766 _SEH2_EXCEPT(set_positive(&ret
), -12345)
772 return ret
== return_positive();
776 /* _SEH2_LEAVE *///{{{
777 DEFINE_TEST(test_leave_1
)
785 ret
= return_positive();
789 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
795 return ret
== return_positive();
798 DEFINE_TEST(test_leave_2
)
806 ret
= return_positive();
809 RaiseException(0xE00DEAD0, 0, 0, NULL
);
812 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
818 return ret
== return_positive();
821 DEFINE_TEST(test_leave_3
)
829 ret
= return_positive();
836 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
842 return ret
== return_positive();
845 DEFINE_TEST(test_leave_4
)
854 int n
= return_one() + return_one();
856 for(i
= return_zero(); i
< n
; ++ i
)
858 if(i
== return_one())
860 ret
= return_positive();
867 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
873 return ret
== return_positive();
876 DEFINE_TEST(test_leave_5
)
886 case 0: ret
= return_zero();
887 case 1: ret
= return_positive(); _SEH2_LEAVE
;
888 case 2: ret
= return_zero();
893 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
899 return ret
== return_positive();
902 DEFINE_TEST(test_leave_6
)
914 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
920 ret
= return_positive();
922 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
928 return ret
== return_positive();
932 /* _SEH2_YIELD() *///{{{
934 int test_yield_1_helper(void)
938 _SEH2_YIELD(return return_positive());
940 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
942 _SEH2_YIELD(return return_zero());
946 return return_zero();
949 DEFINE_TEST(test_yield_1
)
951 return test_yield_1_helper() == return_positive();
955 int test_yield_2_helper(void)
959 RaiseException(0xE00DEAD0, 0, 0, NULL
);
960 _SEH2_YIELD(return return_zero());
962 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
964 _SEH2_YIELD(return return_positive());
968 return return_zero();
971 DEFINE_TEST(test_yield_2
)
973 return test_yield_2_helper() == return_positive();
977 int test_yield_3_helper(void)
983 _SEH2_YIELD(return return_positive());
985 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
987 _SEH2_YIELD(return return_zero());
991 _SEH2_YIELD(return return_zero());
993 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
995 _SEH2_YIELD(return return_zero());
999 return return_zero();
1002 DEFINE_TEST(test_yield_3
)
1004 return test_yield_3_helper() == return_positive();
1008 int test_yield_4_helper(void)
1014 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1015 _SEH2_YIELD(return return_zero());
1017 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1019 _SEH2_YIELD(return return_positive());
1023 _SEH2_YIELD(return return_zero());
1025 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1027 _SEH2_YIELD(return return_zero());
1031 return return_zero();
1034 DEFINE_TEST(test_yield_4
)
1036 return test_yield_4_helper() == return_positive();
1039 static int test_yield_5_ret
;
1042 int test_yield_5_helper(void)
1044 test_yield_5_ret
= return_zero();
1048 _SEH2_YIELD(return return_positive());
1052 test_yield_5_ret
= return_positive();
1056 return return_zero();
1059 DEFINE_TEST(test_yield_5
)
1061 return test_yield_5_helper() == return_positive() && test_yield_5_ret
== return_positive();
1064 int test_yield_6_ret
;
1067 int test_yield_6_helper(void)
1069 test_yield_6_ret
= return_zero();
1075 _SEH2_YIELD(return return_positive());
1079 test_yield_6_ret
= return_positive();
1085 test_yield_6_ret
+= return_one();
1089 return return_zero();
1092 DEFINE_TEST(test_yield_6
)
1094 return test_yield_6_helper() == return_positive() && test_yield_6_ret
== return_positive() + return_one();
1098 /* Termination blocks *///{{{
1099 DEFINE_TEST(test_finally_1
)
1103 ret
= return_zero();
1107 ret
= return_arg(ret
);
1111 ret
= return_positive();
1115 return ret
== return_positive();
1118 DEFINE_TEST(test_finally_2
)
1122 ret
= return_zero();
1126 ret
= return_arg(ret
);
1131 ret
= return_positive();
1135 return ret
== return_positive();
1138 DEFINE_TEST(test_finally_3
)
1142 ret
= return_zero();
1146 ret
= return_arg(ret
);
1147 _SEH2_YIELD(goto leave
);
1151 ret
= return_positive();
1156 return ret
== return_positive();
1159 static int test_finally_4_ret
;
1161 static int test_finally_4_helper(void)
1163 test_finally_4_ret
= return_zero();
1167 test_finally_4_ret
= return_arg(test_finally_4_ret
);
1168 _SEH2_YIELD(return return_positive());
1172 test_finally_4_ret
= return_positive();
1176 return return_zero();
1179 DEFINE_TEST(test_finally_4
)
1181 return test_finally_4_helper() == return_positive() && test_finally_4_ret
;
1184 DEFINE_TEST(test_finally_5
)
1188 ret
= return_zero();
1194 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1195 ret
= return_zero();
1199 ret
= return_positive();
1203 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1205 ret
= return_arg(ret
);
1209 return ret
== return_positive();
1212 DEFINE_TEST(test_finally_6
)
1216 ret
= return_zero();
1222 ret
= return_arg(ret
);
1226 if(ret
== return_zero())
1227 ret
= return_positive();
1233 if(ret
== return_positive())
1234 ret
= return_positive() + return_one();
1238 return ret
== return_positive() + return_one();
1241 DEFINE_TEST(test_finally_7
)
1245 ret
= return_zero();
1251 ret
= return_arg(ret
);
1256 if(ret
== return_zero())
1257 ret
= return_positive();
1263 if(ret
== return_positive())
1264 ret
= return_positive() + return_one();
1268 return ret
== return_positive() + return_one();
1271 DEFINE_TEST(test_finally_8
)
1275 ret
= return_zero();
1281 ret
= return_arg(ret
);
1282 _SEH2_YIELD(goto leave
);
1286 if(ret
== return_zero())
1287 ret
= return_positive();
1293 if(ret
== return_positive())
1294 ret
= return_positive() + return_one();
1299 return ret
== return_positive() + return_one();
1302 static int test_finally_9_ret
;
1304 static int test_finally_9_helper(void)
1306 test_finally_9_ret
= return_zero();
1312 test_finally_9_ret
= return_arg(test_finally_9_ret
);
1313 _SEH2_YIELD(return return_positive());
1317 if(test_finally_9_ret
== return_zero())
1318 test_finally_9_ret
= return_positive();
1324 if(test_finally_9_ret
== return_positive())
1325 test_finally_9_ret
= return_positive() + return_one();
1329 return return_zero();
1332 DEFINE_TEST(test_finally_9
)
1334 return test_finally_9_helper() == return_positive() && test_finally_9_ret
== return_positive() + return_one();
1337 DEFINE_TEST(test_finally_10
)
1341 ret
= return_zero();
1349 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1350 ret
= return_zero();
1354 if(ret
== return_zero())
1355 ret
= return_positive();
1361 if(ret
== return_positive())
1362 ret
= return_positive() + return_one();
1366 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1368 ret
= return_arg(ret
);
1372 return ret
== return_positive() + return_one();
1375 DEFINE_TEST(test_finally_11
)
1379 ret
= return_zero();
1387 ret
= return_arg(ret
);
1389 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1391 ret
= return_zero();
1397 ret
= return_positive();
1398 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1399 ret
= return_zero();
1403 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1405 if(ret
== return_positive())
1406 ret
+= return_one();
1410 return ret
== return_positive() + return_one();
1413 DEFINE_TEST(test_finally_12
)
1417 ret
= return_zero();
1425 ret
= return_arg(ret
);
1429 ret
= return_positive();
1430 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1431 ret
= return_zero();
1437 if(ret
== return_positive())
1438 ret
+= return_one();
1442 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1444 if(ret
== return_positive() + return_one())
1445 ret
+= return_one();
1449 return ret
== return_positive() + return_one() + return_one();
1452 static int test_finally_13_ret
;
1455 void test_finally_13_helper(void)
1457 test_finally_13_ret
= return_zero();
1463 test_finally_13_ret
= return_positive();
1464 _SEH2_YIELD(return);
1465 test_finally_13_ret
= return_zero();
1469 if(test_finally_13_ret
== return_positive())
1470 test_finally_13_ret
+= return_one();
1476 if(test_finally_13_ret
== return_positive() + return_one())
1477 test_finally_13_ret
+= return_one();
1479 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1480 test_finally_13_ret
= return_zero();
1484 test_finally_13_ret
= return_zero();
1487 DEFINE_TEST(test_finally_13
)
1491 ret
= return_zero();
1495 ret
= return_arg(ret
);
1496 test_finally_13_helper();
1497 ret
= return_zero();
1499 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1501 ret
= return_positive();
1505 return ret
== return_positive() && test_finally_13_ret
== return_positive() + return_one() + return_one();
1508 static int test_finally_14_ret
;
1511 void test_finally_14_helper(void)
1513 test_finally_14_ret
= return_zero();
1521 test_finally_14_ret
= return_positive();
1522 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1523 test_finally_14_ret
= return_zero();
1527 if(test_finally_14_ret
== return_positive())
1528 test_finally_14_ret
+= return_one();
1534 if(test_finally_14_ret
== return_positive() + return_one())
1535 test_finally_14_ret
+= return_one();
1537 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1538 test_finally_14_ret
= return_zero();
1542 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1544 if(test_finally_14_ret
== return_positive() + return_one() + return_one())
1545 test_finally_14_ret
+= return_one();
1549 test_finally_14_ret
= return_arg(test_finally_14_ret
);
1552 DEFINE_TEST(test_finally_14
)
1556 ret
= return_zero();
1560 ret
= return_arg(ret
);
1561 test_finally_14_helper();
1562 ret
= return_positive();
1564 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1566 ret
= return_zero();
1570 return ret
== return_positive() && test_finally_14_ret
== return_positive() + return_one() + return_one() + return_one();
1574 /* _SEH2_GetExceptionInformation() *///{{{
1576 int verify_xpointers(struct _EXCEPTION_POINTERS
* ep
, DWORD code
, DWORD flags
, DWORD argc
, const ULONG_PTR
* argv
, int * ret
, int filter
)
1580 ep
->ExceptionRecord
&&
1581 ep
->ContextRecord
&&
1582 ep
->ExceptionRecord
->ExceptionCode
== code
&&
1583 ep
->ExceptionRecord
->ExceptionFlags
== flags
&&
1584 ep
->ExceptionRecord
->NumberParameters
== argc
&&
1586 memcmp(ep
->ExceptionRecord
->ExceptionInformation
, argv
, sizeof(argv
[0]) * argc
) == 0;
1589 *ret
= return_positive();
1594 DEFINE_TEST(test_xpointers_1
)
1598 ret
= return_zero();
1602 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1604 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, 0, 0, NULL
, &ret
, EXCEPTION_EXECUTE_HANDLER
))
1606 ret
= return_arg(ret
);
1610 return ret
== return_positive();
1613 DEFINE_TEST(test_xpointers_2
)
1617 ret
= return_zero();
1621 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 0, NULL
);
1623 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 0, NULL
, &ret
, EXCEPTION_EXECUTE_HANDLER
))
1625 ret
= return_arg(ret
);
1629 return ret
== return_positive();
1632 DEFINE_TEST(test_xpointers_3
)
1635 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1637 ret
= return_zero();
1641 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 0, args
);
1643 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 0, args
, &ret
, EXCEPTION_EXECUTE_HANDLER
))
1645 ret
= return_arg(ret
);
1649 return ret
== return_positive();
1652 DEFINE_TEST(test_xpointers_4
)
1655 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1657 ret
= return_zero();
1661 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 1, args
);
1663 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 1, args
, &ret
, EXCEPTION_EXECUTE_HANDLER
))
1665 ret
= return_arg(ret
);
1669 return ret
== return_positive();
1672 DEFINE_TEST(test_xpointers_5
)
1675 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1677 ret
= return_zero();
1681 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 2, args
);
1683 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 2, args
, &ret
, EXCEPTION_EXECUTE_HANDLER
))
1685 ret
= return_arg(ret
);
1689 return ret
== return_positive();
1692 DEFINE_TEST(test_xpointers_6
)
1695 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1697 ret
= return_zero();
1701 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 3, args
);
1703 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 3, args
, &ret
, EXCEPTION_EXECUTE_HANDLER
))
1705 ret
= return_arg(ret
);
1709 return ret
== return_positive();
1712 DEFINE_TEST(test_xpointers_7
)
1716 ret
= return_zero();
1720 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1721 ret
= return_arg(ret
);
1723 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, 0, 0, NULL
, &ret
, EXCEPTION_CONTINUE_EXECUTION
))
1725 ret
= return_zero();
1729 return ret
== return_positive();
1732 DEFINE_TEST(test_xpointers_8
)
1735 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1737 ret
= return_zero();
1741 RaiseException(0xE00DEAD0, 0, 0, args
);
1742 ret
= return_arg(ret
);
1744 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, 0, 0, args
, &ret
, EXCEPTION_CONTINUE_EXECUTION
))
1746 ret
= return_zero();
1750 return ret
== return_positive();
1753 DEFINE_TEST(test_xpointers_9
)
1756 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1758 ret
= return_zero();
1762 RaiseException(0xE00DEAD0, 0, 1, args
);
1763 ret
= return_arg(ret
);
1765 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, 0, 1, args
, &ret
, EXCEPTION_CONTINUE_EXECUTION
))
1767 ret
= return_zero();
1771 return ret
== return_positive();
1774 DEFINE_TEST(test_xpointers_10
)
1777 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1779 ret
= return_zero();
1783 RaiseException(0xE00DEAD0, 0, 2, args
);
1784 ret
= return_arg(ret
);
1786 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, 0, 2, args
, &ret
, EXCEPTION_CONTINUE_EXECUTION
))
1788 ret
= return_zero();
1792 return ret
== return_positive();
1795 DEFINE_TEST(test_xpointers_11
)
1798 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1800 ret
= return_zero();
1804 RaiseException(0xE00DEAD0, 0, 3, args
);
1805 ret
= return_arg(ret
);
1807 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, 0, 3, args
, &ret
, EXCEPTION_CONTINUE_EXECUTION
))
1809 ret
= return_zero();
1813 return ret
== return_positive();
1816 DEFINE_TEST(test_xpointers_12
)
1820 ret
= return_zero();
1826 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 0, NULL
);
1828 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 0, NULL
, &ret
, EXCEPTION_CONTINUE_SEARCH
))
1830 ret
= return_zero();
1834 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1836 ret
= return_arg(ret
);
1840 return ret
== return_positive();
1843 DEFINE_TEST(test_xpointers_13
)
1846 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1848 ret
= return_zero();
1854 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 0, args
);
1856 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 0, args
, &ret
, EXCEPTION_CONTINUE_SEARCH
))
1858 ret
= return_zero();
1862 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1864 ret
= return_arg(ret
);
1868 return ret
== return_positive();
1871 DEFINE_TEST(test_xpointers_14
)
1874 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1876 ret
= return_zero();
1882 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 1, args
);
1884 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 1, args
, &ret
, EXCEPTION_CONTINUE_SEARCH
))
1886 ret
= return_zero();
1890 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1892 ret
= return_arg(ret
);
1896 return ret
== return_positive();
1899 DEFINE_TEST(test_xpointers_15
)
1902 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1904 ret
= return_zero();
1910 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 2, args
);
1912 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 2, args
, &ret
, EXCEPTION_CONTINUE_SEARCH
))
1914 ret
= return_zero();
1918 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1920 ret
= return_arg(ret
);
1924 return ret
== return_positive();
1927 DEFINE_TEST(test_xpointers_16
)
1930 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1932 ret
= return_zero();
1938 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 3, args
);
1940 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 3, args
, &ret
, EXCEPTION_CONTINUE_SEARCH
))
1942 ret
= return_zero();
1946 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1948 ret
= return_arg(ret
);
1952 return ret
== return_positive();
1956 /* _SEH2_GetExceptionCode() *///{{{
1958 int verify_xcode(int code
, int xcode
, int * ret
, int filter
)
1960 *ret
= code
== xcode
;
1963 *ret
= return_positive();
1968 DEFINE_TEST(test_xcode_1
)
1972 ret
= return_zero();
1976 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1977 ret
= return_zero();
1979 _SEH2_EXCEPT(verify_xcode(_SEH2_GetExceptionCode(), 0xE00DEAD0, &ret
, EXCEPTION_EXECUTE_HANDLER
))
1981 ret
= return_arg(ret
);
1985 return ret
== return_positive();
1988 DEFINE_TEST(test_xcode_2
)
1992 ret
= return_zero();
1996 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1997 ret
= return_arg(ret
);
1999 _SEH2_EXCEPT(verify_xcode(_SEH2_GetExceptionCode(), 0xE00DEAD0, &ret
, EXCEPTION_CONTINUE_EXECUTION
))
2001 ret
= return_zero();
2005 return ret
== return_positive();
2008 DEFINE_TEST(test_xcode_3
)
2012 ret
= return_zero();
2018 RaiseException(0xE00DEAD0, 0, 0, NULL
);
2019 ret
= return_zero();
2021 _SEH2_EXCEPT(verify_xcode(_SEH2_GetExceptionCode(), 0xE00DEAD0, &ret
, EXCEPTION_CONTINUE_SEARCH
))
2023 ret
= return_zero();
2027 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2029 ret
= return_arg(ret
);
2033 return ret
== return_positive();
2037 /* _SEH2_AbnormalTermination() *///{{{
2038 DEFINE_TEST(test_abnorm_1
)
2042 ret
= return_zero();
2046 ret
= return_arg(ret
);
2050 ret
= _SEH2_AbnormalTermination() ? return_zero() : return_positive();
2054 return ret
== return_positive();
2057 DEFINE_TEST(test_abnorm_2
)
2061 ret
= return_zero();
2069 ret
= _SEH2_AbnormalTermination() ? return_zero() : return_positive();
2073 return ret
== return_positive();
2076 DEFINE_TEST(test_abnorm_3
)
2080 ret
= return_zero();
2084 _SEH2_YIELD(goto leave
);
2088 ret
= _SEH2_AbnormalTermination() ? return_positive() : return_zero();
2093 return ret
== return_positive();
2096 DEFINE_TEST(test_abnorm_4
)
2100 ret
= return_zero();
2106 RaiseException(0xE00DEAD0, 0, 0, NULL
);
2107 ret
= return_zero();
2111 ret
= _SEH2_AbnormalTermination() ? return_positive() : return_zero();
2115 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2117 ret
= return_arg(ret
);
2121 return ret
== return_positive();
2124 DEFINE_TEST(test_abnorm_5
)
2128 ret
= return_zero();
2134 ret
= return_arg(ret
);
2138 ret
= _SEH2_AbnormalTermination() ? return_zero() : return_positive();
2144 ret
= ret
== return_positive() && !_SEH2_AbnormalTermination() ? return_positive() + return_one() : ret
;
2148 return ret
== return_positive() + return_one();
2151 DEFINE_TEST(test_abnorm_6
)
2155 ret
= return_zero();
2165 ret
= _SEH2_AbnormalTermination() ? return_zero() : return_positive();
2171 ret
= ret
== return_positive() && !_SEH2_AbnormalTermination() ? return_positive() + return_one() : ret
;
2175 return ret
== return_positive() + return_one();
2178 DEFINE_TEST(test_abnorm_7
)
2182 ret
= return_zero();
2188 _SEH2_YIELD(goto leave
);
2192 ret
= _SEH2_AbnormalTermination() ? return_positive() : return_zero();
2198 ret
= ret
== return_positive() && _SEH2_AbnormalTermination() ? return_positive() + return_one() : ret
;
2203 return ret
== return_positive() + return_one();
2206 DEFINE_TEST(test_abnorm_8
)
2210 ret
= return_zero();
2218 RaiseException(0xE00DEAD0, 0, 0, NULL
);
2219 ret
= return_zero();
2223 ret
= _SEH2_AbnormalTermination() ? return_positive() : return_zero();
2229 ret
= ret
== return_positive() && _SEH2_AbnormalTermination() ? return_positive() + return_one() : ret
;
2233 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2235 ret
= return_arg(ret
);
2239 return ret
== return_positive() + return_one();
2243 /* Use of local variables from _SEH2_EXCEPT(...) and _SEH2_FINALLY { ... } *///{{{
2244 DEFINE_TEST(test_nested_locals_1
)
2246 int var1
= return_one();
2250 RaiseException(0xE00DEAD0, 0, 0, 0);
2252 _SEH2_EXCEPT((var1
= (var1
== return_one() ? return_positive() : var1
)), EXCEPTION_EXECUTE_HANDLER
)
2254 if(var1
== return_positive())
2255 var1
= return_positive() + 1;
2259 return var1
== return_positive() + 1;
2262 DEFINE_TEST(test_nested_locals_2
)
2264 int var1
= return_positive();
2271 if(var1
== return_positive())
2272 var1
= return_positive() + 1;
2276 return var1
== return_positive() + 1;
2279 DEFINE_TEST(test_nested_locals_3
)
2281 int var1
= return_zero();
2287 var1
= return_one();
2288 RaiseException(0xE00DEAD0, 0, 0, 0);
2292 if(var1
== return_one())
2293 var1
= return_positive();
2297 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2299 if(var1
== return_positive())
2300 var1
= return_positive() + 1;
2304 return var1
== return_positive() + 1;
2308 /* System support *///{{{
2312 /* CPU faults *///{{{
2316 /* Past bugs, to detect regressions *///{{{
2317 /* #4004: volatile registers clobbered when catching across frames (originally misreported) *///{{{
2319 void test_bug_4004_helper_1(void)
2323 i1
= return_positive();
2324 i2
= return_positive();
2325 i3
= return_positive();
2326 (void)return_arg(i1
+ i2
+ i3
);
2330 RaiseException(0xE00DEAD0, 0, 0, NULL
);
2339 void test_bug_4004_helper_2(void)
2343 test_bug_4004_helper_1();
2345 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2351 DEFINE_TEST(test_bug_4004
)
2355 i1
= return_positive();
2356 i2
= return_positive();
2357 i3
= return_positive();
2359 test_bug_4004_helper_2();
2361 return return_arg(i1
) + return_arg(i2
) + return_arg(i3
) == return_positive() * 3;
2366 DEFINE_TEST(test_bug_4663
)
2370 i1
= return_positive();
2371 i2
= return_positive();
2377 RaiseException(0xE00DEAD0, 0, 0, 0);
2379 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2381 if (i1
== return_positive())
2383 i1
= return_positive() + 1;
2388 if (i1
== return_positive() + 1)
2390 i1
= return_negative();
2391 RaiseException(0xE00DEAD0, 0, 0, 0);
2394 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2396 i2
= return_negative();
2400 return ((i1
== return_negative()) && (i2
== return_negative()));
2405 DEFINE_TEST(test_unvolatile
)
2412 *((char*)0xc0000000) = 0;
2414 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2423 DEFINE_TEST(test_unvolatile_2
)
2430 *((char*)0xc0000000) = 0;
2433 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2439 return (val
== 3) || (val
== 4) || (val
== 5);
2442 DEFINE_TEST(test_finally_goto
)
2444 volatile int val
= 0;
2457 *((char*)0xdeadc0de) = 0;
2465 *((char*)0xdeadc0de) = 0;
2474 return (val
== (128|4|2|1));
2477 DEFINE_TEST(test_nested_exception
)
2479 volatile int val
= 0;
2487 *((char*)0xdeadc0de) = 0;
2493 *((char*)0xdeadc0de) = 0;
2499 *((char*)0xdeadc0de) = 0;
2508 return (val
== (1|2|8|128));
2512 LONG WINAPI
unhandled_exception(PEXCEPTION_POINTERS ExceptionInfo
)
2514 trace("unhandled exception %08lX thrown from %p\n", ExceptionInfo
->ExceptionRecord
->ExceptionCode
, ExceptionInfo
->ExceptionRecord
->ExceptionAddress
);
2515 return EXCEPTION_CONTINUE_SEARCH
;
2518 #if defined(_M_IX86)
2519 struct volatile_context
2528 struct volatile_context
2536 int sanity_check(int ret
, struct volatile_context
* before
, struct volatile_context
* after
)
2538 if(ret
&& memcmp(before
, after
, sizeof(before
)))
2540 trace("volatile context corrupted\n");
2549 int passthrough_handler(struct _EXCEPTION_RECORD
* e
, void * f
, struct _CONTEXT
* c
, void * d
)
2551 return ExceptionContinueSearch
;
2557 int call_test(int (* func
)(void))
2560 static struct volatile_context before
, after
;
2561 static LPTOP_LEVEL_EXCEPTION_FILTER prev_unhandled_exception
;
2563 static _SEH2Registration_t
* prev_frame
;
2564 _SEH2Registration_t passthrough_frame
;
2567 prev_unhandled_exception
= SetUnhandledExceptionFilter(&unhandled_exception
);
2569 #if defined(_X86_) && !defined(_PSEH3_H_)
2570 prev_frame
= (_SEH2Registration_t
*)__readfsdword(0);
2571 passthrough_frame
.SER_Prev
= prev_frame
;
2572 passthrough_frame
.SER_Handler
= passthrough_handler
;
2573 __writefsdword(0, (unsigned long)&passthrough_frame
);
2576 #if defined(__GNUC__) && defined(__i386__)
2577 __asm__ __volatile__
2579 "mov %%esp, 0x00 + %c[before]\n"
2580 "mov %%ebp, 0x04 + %c[before]\n"
2581 "mov %%ebx, 0x08 + %c[before]\n"
2582 "mov %%esi, 0x0c + %c[before]\n"
2583 "mov %%edi, 0x10 + %c[before]\n"
2585 "mov %%esp, 0x00 + %c[after]\n"
2586 "mov %%ebp, 0x04 + %c[after]\n"
2587 "mov %%ebx, 0x08 + %c[after]\n"
2588 "mov %%esi, 0x0c + %c[after]\n"
2589 "mov %%edi, 0x10 + %c[after]\n"
2593 "call %c[sanity_check]\n"
2598 [test
] "r" (func
), [before
] "i" (&before
), [after
] "i" (&after
), [sanity_check
] "i" (&sanity_check
) :
2599 "ebx", "ecx", "edx", "esi", "edi", "flags", "memory"
2605 #if defined(_X86_) && !defined(_PSEH3_H_)
2606 if((_SEH2Registration_t
*)__readfsdword(0) != &passthrough_frame
|| passthrough_frame
.SER_Prev
!= prev_frame
)
2608 trace("exception registration list corrupted\n");
2612 __writefsdword(0, (unsigned long)prev_frame
);
2615 SetUnhandledExceptionFilter(prev_unhandled_exception
);
2619 DEFINE_TEST(test_PSEH3_bug
)
2621 volatile int count
= 0;
2628 *(volatile int*)0x12345678 = 0x12345678;
2631 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2638 return (count
== 1);
2641 #define USE_TEST_NAME_(NAME_) # NAME_
2642 #define USE_TEST_NAME(NAME_) USE_TEST_NAME_(NAME_)
2643 #define USE_TEST(NAME_) { USE_TEST_NAME(NAME_), NAME_ }
2651 void testsuite_syntax(void)
2653 const struct subtest testsuite
[] =
2655 USE_TEST(test_empty_1
),
2656 USE_TEST(test_empty_2
),
2657 USE_TEST(test_empty_3
),
2658 USE_TEST(test_empty_4
),
2659 USE_TEST(test_empty_5
),
2660 USE_TEST(test_empty_6
),
2661 USE_TEST(test_empty_7
),
2662 USE_TEST(test_empty_8
),
2664 USE_TEST(test_execute_handler_1
),
2665 USE_TEST(test_continue_execution_1
),
2666 USE_TEST(test_continue_search_1
),
2667 USE_TEST(test_execute_handler_2
),
2668 USE_TEST(test_continue_execution_2
),
2670 USE_TEST(test_execute_handler_3
),
2671 USE_TEST(test_continue_execution_3
),
2672 USE_TEST(test_continue_search_2
),
2673 USE_TEST(test_execute_handler_4
),
2674 USE_TEST(test_continue_execution_4
),
2676 USE_TEST(test_execute_handler_5
),
2677 USE_TEST(test_continue_execution_5
),
2678 USE_TEST(test_continue_search_3
),
2679 USE_TEST(test_execute_handler_6
),
2680 USE_TEST(test_continue_execution_6
),
2682 USE_TEST(test_execute_handler_7
),
2683 USE_TEST(test_continue_execution_7
),
2684 USE_TEST(test_continue_search_4
),
2685 USE_TEST(test_execute_handler_8
),
2686 USE_TEST(test_continue_execution_8
),
2688 USE_TEST(test_execute_handler_9
),
2689 USE_TEST(test_continue_execution_9
),
2690 USE_TEST(test_continue_search_5
),
2691 USE_TEST(test_execute_handler_10
),
2692 USE_TEST(test_continue_execution_10
),
2694 USE_TEST(test_execute_handler_11
),
2695 USE_TEST(test_continue_execution_11
),
2696 USE_TEST(test_continue_search_6
),
2697 USE_TEST(test_execute_handler_12
),
2698 USE_TEST(test_continue_execution_12
),
2700 USE_TEST(test_leave_1
),
2701 USE_TEST(test_leave_2
),
2702 USE_TEST(test_leave_3
),
2703 USE_TEST(test_leave_4
),
2704 USE_TEST(test_leave_5
),
2705 USE_TEST(test_leave_6
),
2707 USE_TEST(test_yield_1
),
2708 USE_TEST(test_yield_2
),
2709 USE_TEST(test_yield_3
),
2710 USE_TEST(test_yield_4
),
2711 USE_TEST(test_yield_5
),
2712 USE_TEST(test_yield_6
),
2714 USE_TEST(test_finally_1
),
2715 USE_TEST(test_finally_2
),
2716 USE_TEST(test_finally_3
),
2717 USE_TEST(test_finally_4
),
2718 USE_TEST(test_finally_5
),
2719 USE_TEST(test_finally_6
),
2720 USE_TEST(test_finally_7
),
2721 USE_TEST(test_finally_8
),
2722 USE_TEST(test_finally_9
),
2723 USE_TEST(test_finally_10
),
2724 USE_TEST(test_finally_11
),
2725 USE_TEST(test_finally_12
),
2726 USE_TEST(test_finally_13
),
2727 USE_TEST(test_finally_14
),
2729 USE_TEST(test_xpointers_1
),
2730 USE_TEST(test_xpointers_2
),
2731 USE_TEST(test_xpointers_3
),
2732 USE_TEST(test_xpointers_4
),
2733 USE_TEST(test_xpointers_5
),
2734 USE_TEST(test_xpointers_6
),
2735 USE_TEST(test_xpointers_7
),
2736 USE_TEST(test_xpointers_8
),
2737 USE_TEST(test_xpointers_9
),
2738 USE_TEST(test_xpointers_10
),
2739 USE_TEST(test_xpointers_11
),
2740 USE_TEST(test_xpointers_12
),
2741 USE_TEST(test_xpointers_13
),
2742 USE_TEST(test_xpointers_14
),
2743 USE_TEST(test_xpointers_15
),
2744 USE_TEST(test_xpointers_16
),
2746 USE_TEST(test_xcode_1
),
2747 USE_TEST(test_xcode_2
),
2748 USE_TEST(test_xcode_3
),
2750 USE_TEST(test_abnorm_1
),
2751 USE_TEST(test_abnorm_2
),
2752 USE_TEST(test_abnorm_3
),
2753 USE_TEST(test_abnorm_4
),
2754 USE_TEST(test_abnorm_5
),
2755 USE_TEST(test_abnorm_6
),
2756 USE_TEST(test_abnorm_7
),
2757 USE_TEST(test_abnorm_8
),
2759 USE_TEST(test_nested_locals_1
),
2760 USE_TEST(test_nested_locals_2
),
2761 USE_TEST(test_nested_locals_3
),
2763 USE_TEST(test_bug_4004
),
2764 USE_TEST(test_bug_4663
),
2766 USE_TEST(test_unvolatile
),
2767 USE_TEST(test_unvolatile_2
),
2768 USE_TEST(test_finally_goto
),
2769 USE_TEST(test_nested_exception
),
2770 USE_TEST(test_PSEH3_bug
),
2775 for(i
= 0; i
< sizeof(testsuite
) / sizeof(testsuite
[0]); ++ i
)
2776 ok(call_test(testsuite
[i
].func
), "%s failed\n", testsuite
[i
].name
);
2779 const struct test winetest_testlist
[] = {
2780 { "pseh2_syntax", testsuite_syntax
},