2 using System
.Reflection
;
3 using System
.Runtime
.CompilerServices
;
6 * Regression tests for the mono JIT.
8 * Each test needs to be of the form:
10 * public static int test_<result>_<name> ();
12 * where <result> is an integer (the value that needs to be returned by
13 * the method to make it pass.
14 * <name> is a user-displayed name used to identify the test.
16 * The tests can be driven in two ways:
17 * *) running the program directly: Main() uses reflection to find and invoke
18 * the test methods (this is useful mostly to check that the tests are correct)
19 * *) with the --regression switch of the jit (this is the preferred way since
20 * all the tests will be run with optimizations on and off)
22 * The reflection logic could be moved to a .dll since we need at least another
23 * regression test file written in IL code to have better control on how
35 public static int Main (string[] args
) {
36 return TestDriver
.RunTests (typeof (Tests
), args
);
40 public static int test_0_catch () {
41 Exception x
= new Exception ();
45 } catch (Exception e
) {
52 public static int test_0_finally_without_exc () {
57 } catch (Exception e
) {
66 public static int test_0_finally () {
70 throw new Exception ();
71 } catch (Exception e
) {
79 public static int test_0_nested_finally () {
94 public static int test_0_byte_cast () {
107 } catch (OverflowException
) {
121 } catch (OverflowException
) {
136 } catch (OverflowException
) {
150 } catch (OverflowException
) {
164 } catch (OverflowException
) {
178 } catch (OverflowException
) {
192 } catch (OverflowException
) {
206 } catch (OverflowException
) {
220 } catch (OverflowException
) {
234 } catch (OverflowException
) {
248 } catch (OverflowException
) {
262 } catch (OverflowException
) {
277 catch (OverflowException
) {
288 public static int test_0_sbyte_cast () {
300 } catch (OverflowException
) {
314 } catch (OverflowException
) {
328 } catch (OverflowException
) {
342 } catch (OverflowException
) {
356 } catch (OverflowException
) {
370 } catch (OverflowException
) {
384 } catch (OverflowException
) {
398 } catch (OverflowException
) {
412 } catch (OverflowException
) {
426 } catch (OverflowException
) {
440 } catch (OverflowException
) {
454 } catch (OverflowException
) {
468 } catch (OverflowException
) {
482 } catch (OverflowException
) {
496 } catch (OverflowException
) {
510 } catch (OverflowException
) {
524 } catch (OverflowException
) {
538 } catch (OverflowException
) {
552 } catch (OverflowException
) {
566 } catch (OverflowException
) {
581 catch (OverflowException
) {
592 public static int test_0_ushort_cast () {
600 a
= System
.UInt16
.MaxValue
;
605 } catch (OverflowException
) {
617 } catch (OverflowException
) {
624 a
= System
.UInt16
.MaxValue
+ 1;
629 } catch (OverflowException
) {
641 } catch (OverflowException
) {
653 } catch (OverflowException
) {
660 double d
= System
.UInt16
.MaxValue
;
665 } catch (OverflowException
) {
677 } catch (OverflowException
) {
684 double d
= System
.UInt16
.MaxValue
+ 1.0;
689 } catch (OverflowException
) {
696 l
= System
.UInt16
.MaxValue
;
701 } catch (OverflowException
) {
713 } catch (OverflowException
) {
720 l
= System
.UInt16
.MaxValue
+ 1;
725 } catch (OverflowException
) {
737 } catch (OverflowException
) {
749 } catch (OverflowException
) {
758 public static int test_0_short_cast () {
765 a
= System
.UInt16
.MaxValue
;
770 } catch (OverflowException
) {
782 } catch (OverflowException
) {
789 a
= System
.Int16
.MaxValue
+ 1;
794 } catch (OverflowException
) {
801 a
= System
.Int16
.MinValue
- 1;
806 } catch (OverflowException
) {
818 } catch (OverflowException
) {
825 a
= System
.Int16
.MinValue
;
830 } catch (OverflowException
) {
837 a
= System
.Int16
.MaxValue
;
842 } catch (OverflowException
) {
849 a
= System
.Int16
.MaxValue
+ 1;
854 } catch (OverflowException
) {
861 double d
= System
.Int16
.MaxValue
;
866 } catch (OverflowException
) {
873 double d
= System
.Int16
.MinValue
;
878 } catch (OverflowException
) {
885 double d
= System
.Int16
.MaxValue
+ 1.0;
890 } catch (OverflowException
) {
897 double d
= System
.Int16
.MinValue
- 1.0;
902 } catch (OverflowException
) {
909 l
= System
.Int16
.MaxValue
+ 1;
914 } catch (OverflowException
) {
921 l
= System
.Int16
.MaxValue
;
926 } catch (OverflowException
) {
933 l
= System
.Int16
.MinValue
- 1;
938 } catch (OverflowException
) {
946 l
= System
.Int16
.MinValue
;
951 } catch (OverflowException
) {
958 l
= 0x00000000ffffffff;
963 } catch (OverflowException
) {
975 } catch (OverflowException
) {
984 public static int test_0_int_cast () {
990 double d
= System
.Int32
.MaxValue
+ 1.0;
995 } catch (OverflowException
) {
1002 double d
= System
.Int32
.MaxValue
;
1007 } catch (OverflowException
) {
1015 double d
= System
.Int32
.MinValue
;
1020 } catch (OverflowException
) {
1028 double d
= System
.Int32
.MinValue
- 1.0;
1033 } catch (OverflowException
) {
1040 l
= System
.Int32
.MaxValue
+ (long)1;
1045 } catch (OverflowException
) {
1052 l
= System
.Int32
.MaxValue
;
1057 } catch (OverflowException
) {
1065 l
= System
.Int32
.MinValue
;
1070 } catch (OverflowException
) {
1078 l
= System
.Int32
.MinValue
- (long)1;
1083 } catch (OverflowException
) {
1090 uint ui
= System
.UInt32
.MaxValue
;
1096 catch (OverflowException
) {
1103 ulong ul
= (long)(System
.Int32
.MaxValue
) + 1;
1109 catch (OverflowException
) {
1116 ulong ul
= UInt64
.MaxValue
;
1122 catch (OverflowException
) {
1139 public static int test_0_uint_cast () {
1145 double d
= System
.UInt32
.MaxValue
;
1150 } catch (OverflowException
) {
1157 double d
= System
.UInt32
.MaxValue
+ 1.0;
1162 } catch (OverflowException
) {
1169 double d
= System
.UInt32
.MinValue
;
1174 } catch (OverflowException
) {
1181 double d
= System
.UInt32
.MinValue
- 1.0;
1186 } catch (OverflowException
) {
1193 l
= System
.UInt32
.MaxValue
;
1198 } catch (OverflowException
) {
1205 l
= System
.UInt32
.MaxValue
+ (long)1;
1210 } catch (OverflowException
) {
1217 l
= System
.UInt32
.MinValue
;
1222 } catch (OverflowException
) {
1229 l
= System
.UInt32
.MinValue
- (long)1;
1234 } catch (OverflowException
) {
1247 catch (OverflowException
) {
1264 public static int test_0_long_cast () {
1267 * These tests depend on properties of x86 fp arithmetic so they won't work
1268 * on other platforms.
1275 double d = System.Int64.MaxValue - 512.0;
1280 } catch (OverflowException) {
1287 double d = System.Int64.MaxValue - 513.0;
1292 } catch (OverflowException) {
1299 double d = System.Int64.MinValue - 1024.0;
1304 } catch (OverflowException) {
1311 double d = System.Int64.MinValue - 1025.0;
1316 } catch (OverflowException) {
1334 /* Github issue 13284 */
1335 public static int test_0_ulong_ovf_spilling () {
1346 // Console.WriteLine ($"u64 ({x} - {y} >= {z}) => {a} [{(a == false ? "OK" : "NG")}]");
1347 } catch (OverflowException
) {
1349 // Console.WriteLine ($"u64 ({x} - {y} >= {z}) => overflow [NG]");
1356 // Console.WriteLine ($"u64 ({t} >= {z}) => {a} [{(a == false ? "OK" : "NG")}]");
1357 } catch (OverflowException
) {
1359 // Console.WriteLine ($"u64 ({t} >= {z}) => overflow [NG]");
1363 var a
= x
- y
- z
>= 0;
1368 // Console.WriteLine ($"u64 ({x} - {y} - {z} >= 0) => {a} [NG]");
1369 } catch (OverflowException
) {
1371 // Console.WriteLine ($"u64 ({x} - {y} - {z} >= 0) => overflow [OK]");
1376 public static int test_0_ulong_cast () {
1381 * These tests depend on properties of x86 fp arithmetic so they won't work
1382 * on other platforms.
1387 double d = System.UInt64.MaxValue - 1024.0;
1392 } catch (OverflowException) {
1399 double d = System.UInt64.MaxValue - 1025.0;
1404 } catch (OverflowException) {
1417 } catch (OverflowException
) {
1429 } catch (OverflowException
) {
1450 catch (OverflowException
) {
1457 int i
= Int32
.MinValue
;
1463 catch (OverflowException
) {
1472 public static int test_0_simple_double_casts () {
1474 double d
= 0xffffffff;
1476 if ((uint)d
!= 4294967295)
1480 * These tests depend on properties of x86 fp arithmetic so they won't work
1481 * on other platforms.
1484 d = 0xffffffffffffffff;
1498 if ((ushort)d
!= 0xffff)
1501 if ((byte)d
!= 0xff)
1507 public static int test_0_div_zero () {
1516 } catch (DivideByZeroException
) {
1525 } catch (DivideByZeroException
) {
1536 } catch (DivideByZeroException
) {
1537 /* wrong exception */
1538 } catch (OverflowException
) {
1549 } catch (DivideByZeroException
) {
1550 /* wrong exception */
1551 } catch (OverflowException
) {
1560 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
1561 static void dummy () {
1564 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
1565 static int div_zero_llvm_inner (int i
) {
1567 // This call make use avoid the 'handler without invoke' restriction in the llvm backend
1570 } catch (Exception ex
) {
1575 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
1576 static long div_zero_llvm_inner_long (long l
) {
1580 } catch (Exception ex
) {
1585 public static int test_0_div_zero_llvm () {
1586 long r
= div_zero_llvm_inner (0);
1589 r
= div_zero_llvm_inner_long (0);
1595 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
1596 static int div_overflow_llvm_inner (int i
) {
1599 return Int32
.MinValue
/ i
;
1600 } catch (Exception ex
) {
1605 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
1606 static long div_overflow_llvm_inner_long (long l
) {
1609 return Int64
.MinValue
/ l
;
1610 } catch (Exception ex
) {
1615 public static int test_0_div_overflow_llvm () {
1616 long r
= div_overflow_llvm_inner (-1);
1619 r
= div_overflow_llvm_inner_long ((long)-1);
1625 public static int return_55 () {
1629 public static int test_0_cfold_div_zero () {
1630 // Test that constant folding doesn't cause division by zero exceptions
1631 if (return_55 () != return_55 ()) {
1650 public static int test_0_udiv_zero () {
1659 } catch (DivideByZeroException
) {
1668 } catch (DivideByZeroException
) {
1677 public static int test_0_long_div_zero () {
1686 } catch (DivideByZeroException
) {
1695 } catch (DivideByZeroException
) {
1706 } catch (DivideByZeroException
) {
1707 /* wrong exception */
1708 } catch (OverflowException
) {
1719 } catch (DivideByZeroException
) {
1720 /* wrong exception */
1721 } catch (OverflowException
) {
1730 public static int test_0_ulong_div_zero () {
1739 } catch (DivideByZeroException
) {
1748 } catch (DivideByZeroException
) {
1757 public static int test_0_float_div_zero () {
1766 } catch (DivideByZeroException
) {
1775 } catch (DivideByZeroException
) {
1784 public static int test_0_invalid_unbox () {
1787 object o
= "Some string";
1791 // Illegal conversion; o contains a string not an int
1793 } catch (Exception e
) {
1801 // Test that double[] can't be cast to double (bug #46027)
1802 public static int test_0_invalid_unbox_arrays () {
1803 double[] d1
= { 1.0 }
;
1804 double[][] d2
= { d1 }
;
1808 foreach (double d
in a
) {
1812 catch (InvalidCastException e
) {
1817 /* bug# 42190, at least mcs generates a leave for the return that
1818 * jumps out of multiple exception clauses: we used to execute just
1819 * one enclosing finally block.
1821 public static int finally_level
;
1822 static void do_something () {
1835 public static int test_2_multiple_finally_clauses () {
1838 if (finally_level
== 1)
1843 public static int test_3_checked_cast_un () {
1844 ulong i
= 0x8000000034000000;
1848 checked { j = (long)i; }
1849 } catch (OverflowException
) {
1858 public static int test_4_checked_cast () {
1862 unchecked { i = (long)0x8000000034000000;}
;
1864 checked { j = (ulong)i; }
1865 } catch (OverflowException
) {
1874 static readonly int[] mul_dim_results
= new int[] {
1875 0, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8,
1876 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, 1, 5, 1, 6, 1, 7, 1, 8,
1880 5, 0, 5, 1, 5, 2, 5, 3, 5, 4, 5, 5, 5, 6, 5, 7, 5, 8,
1881 6, 0, 6, 1, 6, 2, 6, 3, 6, 4, 6, 5, 6, 6, 6, 7, 6, 8,
1882 7, 0, 7, 1, 7, 2, 7, 3, 7, 4, 7, 5, 7, 6, 7, 7, 7, 8,
1885 public static int test_0_multi_dim_array_access () {
1886 int [,] a
= System
.Array
.CreateInstance (typeof (int),
1887 new int [] {3,6}
, new int [] {2,2 }
) as int[,];
1890 for (x
= 0; x
< 8; ++x
) {
1891 for (y
= 0; y
< 9; ++y
) {
1892 bool got_ex
= false;
1899 if (result_idx
>= mul_dim_results
.Length
)
1901 if (mul_dim_results
[result_idx
] != x
|| mul_dim_results
[result_idx
+ 1] != y
) {
1902 return result_idx
+ 1;
1908 if (result_idx
== mul_dim_results
.Length
)
1913 static void helper_out_obj (out object o
) {
1914 o
= (object)"buddy";
1917 static void helper_out_string (out string o
) {
1921 public static int test_2_array_mismatch () {
1922 string[] a
= { "hello", "world" }
;
1924 bool passed
= false;
1927 helper_out_obj (out b
[1]);
1928 } catch (ArrayTypeMismatchException
) {
1933 helper_out_string (out a
[1]);
1934 if (a
[1] != "buddy")
1939 public static int test_0_ovf1 () {
1944 ulong a
= UInt64
.MaxValue
- 1;
1953 public static int test_1_ovf2 () {
1958 ulong a
= UInt64
.MaxValue
;
1967 public static int test_0_ovf3 () {
1970 long a
= Int64
.MaxValue
- 1;
1981 public static int test_1_ovf4 () {
1984 long a
= Int64
.MaxValue
;
1995 public static int test_0_ovf5 () {
1998 ulong a
= UInt64
.MaxValue
- 1;
2009 public static int test_1_ovf6 () {
2012 ulong a
= UInt64
.MaxValue
;
2023 public static int test_0_ovf7 () {
2026 long a
= Int64
.MinValue
+ 1;
2037 public static int test_1_ovf8 () {
2040 long a
= Int64
.MinValue
;
2051 public static int test_0_ovf9 () {
2054 ulong a
= UInt64
.MinValue
+ 1;
2065 public static int test_1_ovf10 () {
2068 ulong a
= UInt64
.MinValue
;
2079 public static int test_0_ovf11 () {
2082 int a
= Int32
.MinValue
+ 1;
2093 public static int test_1_ovf12 () {
2096 int a
= Int32
.MinValue
;
2107 public static int test_0_ovf13 () {
2121 public static int test_1_ovf14 () {
2135 public static int test_0_ovf15 () {
2149 public static int test_1_ovf16 () {
2163 public static int test_0_ovf17 () {
2175 public static int test_0_ovf18 () {
2189 public static int test_1_ovf19 () {
2203 public static int test_0_ovf20 () {
2208 ulong a
= 0xffffffffff;
2209 ulong t
= a
*0x0ffffff;
2217 public static int test_1_ovf21 () {
2220 ulong a
= 0xffffffffff;
2223 ulong t
= a
*0x0fffffff;
2231 public static int test_1_ovf22 () {
2234 long a
= Int64
.MinValue
;
2246 public static int test_1_ovf23 () {
2250 long b
= Int64
.MinValue
;
2262 public static int i
;
2265 throw new Exception ("Ugh!");
2268 public static int DoSomething () {
2273 public static int test_0_exception_in_cctor () {
2275 Broken
.DoSomething ();
2277 catch (TypeInitializationException
) {
2278 // This will only happen once even if --regression is used
2283 public static int test_5_regalloc () {
2287 for (i
= 0; i
< 10; ++i
) {
2289 throw new Exception ();
2297 // Check that variables written in catch clauses are volatile
2300 throw new Exception ();
2311 throw new Exception ();
2325 public static void rethrow () {
2327 throw new ApplicationException();
2328 } catch (ApplicationException
) {
2330 throw new OverflowException();
2331 } catch (Exception
) {
2337 // Test that a rethrow rethrows the correct exception
2338 public static int test_0_rethrow_nested () {
2341 } catch (OverflowException
) {
2343 } catch (Exception
) {
2349 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
2350 public static void rethrow1 () {
2351 throw new Exception ();
2354 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
2355 public static void rethrow2 () {
2357 /* This disables tailcall opts */
2358 Console
.WriteLine ();
2361 [Category ("!BITCODE")]
2362 public static int test_0_rethrow_stacktrace () {
2363 // Check that rethrowing an exception preserves the original stack trace
2368 catch (Exception ex
) {
2369 // Check that each catch clause has its own exception variable
2370 // If not, the throw below will overwrite the exception used
2373 throw new DivideByZeroException ();
2375 catch (Exception foo
) {
2381 catch (Exception ex
) {
2382 if (ex
.StackTrace
.IndexOf ("rethrow2") != -1)
2390 class Face
: IFace
{}
2392 public static int test_1_array_mismatch_2 () {
2394 object [] o
= new Face
[1];
2397 } catch (ArrayTypeMismatchException
) {
2402 public static int test_1_array_mismatch_3 () {
2404 object [] o
= new IFace
[1];
2407 } catch (ArrayTypeMismatchException
) {
2412 public static int test_1_array_mismatch_4 () {
2414 object [][] o
= new Face
[5] [];
2415 o
[0] = new object [5];
2418 } catch (ArrayTypeMismatchException
) {
2423 public static int test_0_array_size () {
2428 int[,] mem2
= new int [Int32
.MaxValue
, Int32
.MaxValue
];
2430 catch (OutOfMemoryException e
) {
2440 int i
, j
, k
, l
, m
, n
;
2443 static IntPtr
[] addr
;
2445 static unsafe void throw_func (int i
, S s
) {
2446 addr
[i
] = new IntPtr (&i
);
2447 throw new Exception ();
2450 /* Test that arguments are correctly popped off the stack during unwinding */
2451 /* FIXME: Fails on x86 when llvm is enabled (#5432) */
2453 public static int test_0_stack_unwind () {
2454 addr = new IntPtr [1000];
2456 for (int j = 0; j < 1000; j++) {
2463 return (addr [0].ToInt64 () - addr [100].ToInt64 () < 100) ? 0 : 1;
2467 static unsafe void get_sp (int i
) {
2468 addr
[i
] = new IntPtr (&i
);
2471 /* Test that the arguments to the throw trampoline are correctly popped off the stack */
2472 public static int test_0_throw_unwind () {
2473 addr
= new IntPtr
[1000];
2475 for (int j
= 0; j
< 1000; j
++) {
2478 throw new Exception ();
2483 return (addr
[0].ToInt64 () - addr
[100].ToInt64 () < 100) ? 0 : 1;
2486 public static int test_0_regress_73242 () {
2487 int [] arr
= new int [10];
2488 for (int i
= 0; i
< 10; ++i
)
2491 throw new Exception ();
2498 public static int test_0_nullref () {
2502 } catch (NullReferenceException e
) {
2508 public int amethod () {
2512 public static int test_0_nonvirt_nullref_at_clause_start () {
2513 ExceptionTests t
= null;
2516 } catch (NullReferenceException
) {
2523 public static int throw_only () {
2524 throw new Exception ();
2527 [MethodImpl(MethodImplOptions
.NoInlining
)]
2528 public static int throw_only2 () {
2529 return throw_only ();
2532 public static int test_0_inline_throw_only () {
2534 return throw_only2 ();
2536 catch (Exception ex
) {
2541 public static string GetText (string s
) {
2545 public static int throw_only_gettext () {
2546 throw new Exception (GetText ("FOO"));
2549 public static int test_0_inline_throw_only_gettext () {
2552 o
= throw_only_gettext ();
2554 catch (Exception ex
) {
2558 return o
!= null ? 0 : 1;
2562 public static int test_0_throw_to_branch_opt_outer_clause () {
2567 string [] files
= new string[1];
2569 string s
= files
[2];
2576 return (i
== 1) ? 0 : 1;
2580 public static int test_0_try_inside_finally_cmov_opt () {
2581 bool Reconect
= false;
2583 object o
= new object ();
2587 catch (Exception ExCon
) {
2593 catch (Exception Last
) {
2597 if (Reconect
== true) {
2600 catch (Exception ex
) {
2608 public static int test_0_inline_throw () {
2617 // for llvm, the end bblock is unreachable
2618 public static int inline_throw1 (int i
) {
2620 throw new Exception ();
2622 return inline_throw2 (i
);
2625 public static int inline_throw2 (int i
) {
2626 throw new Exception ();
2630 public static int test_0_lmf_filter () {
2632 // The invoke calls a runtime-invoke wrapper which has a filter clause
2634 typeof (ExceptionTests
).GetMethod ("lmf_filter").Invoke (null, new object [] { }
);
2636 typeof (Tests
).GetMethod ("lmf_filter").Invoke (null, new object [] { }
);
2638 } catch (TargetInvocationException
) {
2643 public static void lmf_filter () {
2648 throw new NotImplementedException ();
2652 public static void Connect () {
2654 throw new Exception();
2657 public static void Stop () {
2665 private static void do_raise () {
2666 throw new System
.Exception ();
2669 private static int int_func (int i
) {
2674 public static int test_8_local_deadce_causes () {
2681 } catch (System
.Exception
) {
2687 public static int test_0_except_opt_two_clauses () {
2690 uint ui
= (uint)size
;
2693 uint v
= ui
* (uint)4;
2695 } catch (OverflowException e
) {
2697 } catch (Exception
) {
2706 public virtual long Method()
2708 throw new Exception();
2713 public static int test_100_long_vars_in_clauses_initlocals_opt () {
2714 Child c
= new Child();
2724 public object AnObj
;
2727 public static void DoSomething (ref object o
) {
2730 public static int test_0_ldflda_null () {
2734 DoSomething (ref a
.AnObj
);
2735 } catch (NullReferenceException
) {
2746 public static Foo
* pFoo
;
2749 /* MS.NET doesn't seem to throw in this case */
2750 public unsafe static int test_0_ldflda_null_pointer () {
2751 int* pi
= &Foo
.pFoo
->i
;
2756 static int test_0_try_clause_in_finally_clause_regalloc () {
2757 // Fill up registers with values
2758 object a
= new object ();
2759 object[] arr1
= new object [1];
2760 object[] arr2
= new object [1];
2761 object[] arr3
= new object [1];
2762 object[] arr4
= new object [1];
2763 object[] arr5
= new object [1];
2765 for (int i
= 0; i
< 10; ++i
)
2767 for (int i
= 0; i
< 10; ++i
)
2769 for (int i
= 0; i
< 10; ++i
)
2771 for (int i
= 0; i
< 10; ++i
)
2773 for (int i
= 0; i
< 10; ++i
)
2778 try_clause_in_finally_clause_regalloc_inner (out res
);
2779 } catch (Exception
) {
2784 public static object Throw () {
2785 for (int i
= 0; i
< 10; ++i
)
2787 throw new Exception ();
2790 static void try_clause_in_finally_clause_regalloc_inner (out int res
) {
2796 } catch (Exception
) {
2797 /* Make sure this doesn't branch to the finally */
2798 throw new DivideByZeroException ();
2801 /* Make sure o is register allocated */
2814 } catch (DivideByZeroException
) {
2819 public static bool t_1835_inner () {
2821 if (a
) throw new Exception();
2825 [MethodImpl(MethodImplOptions
.NoInlining
)]
2826 public static bool t_1835_inner_2 () {
2827 bool b
= t_1835_inner ();
2831 public static int test_0_inline_retval_throw_in_branch_1835 () {
2840 static bool finally_called
= false;
2842 static void regress_30472 (int a
, int b
) {
2847 finally_called
= true;
2852 public static int test_0_regress_30472 () {
2853 finally_called
= false;
2855 regress_30472 (Int32
.MaxValue
- 1, 2);
2856 } catch (Exception ex
) {
2858 return finally_called
? 0 : 1;
2861 static int array_len_1
= 1;
2863 public static int test_0_bounds_check_negative_constant () {
2865 byte[] arr
= new byte [array_len_1
];
2871 byte[] arr
= new byte [array_len_1
];
2879 public static int test_0_string_bounds_check_negative_constant () {
2889 public class MyException
: Exception
{
2890 public int marker
= 0;
2891 public string res
= "";
2893 public MyException (String res
) {
2897 public bool FilterWithoutState () {
2898 return this.marker
== 0x666;
2901 public bool FilterWithState () {
2902 bool ret
= this.marker
== 0x566;
2903 this.marker
+= 0x100;
2907 public bool FilterWithStringState () {
2908 bool ret
= this.marker
== 0x777;
2909 this.res
= "fromFilter_" + this.res
;
2914 [Category ("!BITCODE")]
2915 public static int test_1_basic_filter_catch () {
2917 MyException e
= new MyException ("");
2920 } catch (MyException ex
) when (ex
.marker
== 0x1337) {
2926 [Category ("!BITCODE")]
2927 public static int test_1234_complicated_filter_catch () {
2928 string res
= "init";
2930 MyException e
= new MyException (res
);
2935 } catch (MyException ex
) when (ex
.FilterWithoutState ()) {
2936 res
= "WRONG_" + res
;
2939 res
= "innerFinally_" + res
;
2941 } catch (MyException ex
) when (ex
.FilterWithState ()) {
2942 res
= "2ndcatch_" + res
;
2944 // "2ndcatch_innerFinally_init"
2945 // Console.WriteLine ("res1: " + res);
2948 } catch (MyException ex
) when (ex
.FilterWithStringState ()) {
2949 res
= "fwos_" + ex
.res
;
2951 res
= "outerFinally_" + res
;
2953 // Console.WriteLine ("res2: " + res);
2954 return "outerFinally_fwos_fromFilter_2ndcatch_innerFinally_init" == res
? 1234 : 0;
2957 public struct FooStruct
2959 public long Part1 { get; }
2960 public long Part2 { get; }
2962 public byte Part3 { get; }
2965 [MethodImpl( MethodImplOptions
.NoInlining
)]
2966 private static bool ExceptionFilter( byte x
, FooStruct item
) => true;
2968 [Category ("!BITCODE")]
2969 public static int test_0_filter_caller_area () {
2971 throw new Exception();
2973 catch (Exception
) when (ExceptionFilter (default(byte), default (FooStruct
))) {
2978 public static int test_0_signed_ct_div () {
2980 bool divide_by_zero
= false;
2981 bool overflow
= false;
2987 } catch (OverflowException
) {
2995 } catch (DivideByZeroException
) {
2996 divide_by_zero
= true;
2998 if (!divide_by_zero
)
3001 if ((n
/ 35) != -61356675)
3003 if ((n
/ -35) != 61356675)
3005 n
= -(n
+ 1); /* MaxValue */
3006 if ((n
/ 35) != 61356675)
3008 if ((n
/ -35) != -61356675)
3014 public static int test_0_unsigned_ct_div () {
3015 uint n
= 4294967295;
3016 bool divide_by_zero
= false;
3020 } catch (DivideByZeroException
) {
3021 divide_by_zero
= true;
3024 if (!divide_by_zero
)
3027 if ((n
/ 35) != 122713351)
3035 class ExceptionTests
: Tests