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 public static int test_0_ulong_cast () {
1339 * These tests depend on properties of x86 fp arithmetic so they won't work
1340 * on other platforms.
1345 double d = System.UInt64.MaxValue - 1024.0;
1350 } catch (OverflowException) {
1357 double d = System.UInt64.MaxValue - 1025.0;
1362 } catch (OverflowException) {
1375 } catch (OverflowException
) {
1387 } catch (OverflowException
) {
1408 catch (OverflowException
) {
1415 int i
= Int32
.MinValue
;
1421 catch (OverflowException
) {
1430 [Category ("!WASM")] // reported as https://github.com/kripken/emscripten/issues/5603
1431 public static int test_0_simple_double_casts () {
1433 double d
= 0xffffffff;
1435 if ((uint)d
!= 4294967295)
1439 * These tests depend on properties of x86 fp arithmetic so they won't work
1440 * on other platforms.
1443 d = 0xffffffffffffffff;
1457 if ((ushort)d
!= 0xffff)
1460 if ((byte)d
!= 0xff)
1466 public static int test_0_div_zero () {
1475 } catch (DivideByZeroException
) {
1484 } catch (DivideByZeroException
) {
1495 } catch (DivideByZeroException
) {
1496 /* wrong exception */
1497 } catch (OverflowException
) {
1508 } catch (DivideByZeroException
) {
1509 /* wrong exception */
1510 } catch (OverflowException
) {
1519 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
1520 static void dummy () {
1523 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
1524 static int div_zero_llvm_inner (int i
) {
1526 // This call make use avoid the 'handler without invoke' restriction in the llvm backend
1529 } catch (Exception ex
) {
1534 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
1535 static long div_zero_llvm_inner_long (long l
) {
1539 } catch (Exception ex
) {
1544 public static int test_0_div_zero_llvm () {
1545 long r
= div_zero_llvm_inner (0);
1548 r
= div_zero_llvm_inner_long (0);
1554 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
1555 static int div_overflow_llvm_inner (int i
) {
1558 return Int32
.MinValue
/ i
;
1559 } catch (Exception ex
) {
1564 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
1565 static long div_overflow_llvm_inner_long (long l
) {
1568 return Int64
.MinValue
/ l
;
1569 } catch (Exception ex
) {
1574 public static int test_0_div_overflow_llvm () {
1575 long r
= div_overflow_llvm_inner (-1);
1578 r
= div_overflow_llvm_inner_long ((long)-1);
1584 public static int return_55 () {
1588 public static int test_0_cfold_div_zero () {
1589 // Test that constant folding doesn't cause division by zero exceptions
1590 if (return_55 () != return_55 ()) {
1609 public static int test_0_udiv_zero () {
1618 } catch (DivideByZeroException
) {
1627 } catch (DivideByZeroException
) {
1636 public static int test_0_long_div_zero () {
1645 } catch (DivideByZeroException
) {
1654 } catch (DivideByZeroException
) {
1665 } catch (DivideByZeroException
) {
1666 /* wrong exception */
1667 } catch (OverflowException
) {
1678 } catch (DivideByZeroException
) {
1679 /* wrong exception */
1680 } catch (OverflowException
) {
1689 public static int test_0_ulong_div_zero () {
1698 } catch (DivideByZeroException
) {
1707 } catch (DivideByZeroException
) {
1716 public static int test_0_float_div_zero () {
1725 } catch (DivideByZeroException
) {
1734 } catch (DivideByZeroException
) {
1743 public static int test_0_invalid_unbox () {
1746 object o
= "Some string";
1750 // Illegal conversion; o contains a string not an int
1752 } catch (Exception e
) {
1760 // Test that double[] can't be cast to double (bug #46027)
1761 public static int test_0_invalid_unbox_arrays () {
1762 double[] d1
= { 1.0 }
;
1763 double[][] d2
= { d1 }
;
1767 foreach (double d
in a
) {
1771 catch (InvalidCastException e
) {
1776 /* bug# 42190, at least mcs generates a leave for the return that
1777 * jumps out of multiple exception clauses: we used to execute just
1778 * one enclosing finally block.
1780 public static int finally_level
;
1781 static void do_something () {
1794 public static int test_2_multiple_finally_clauses () {
1797 if (finally_level
== 1)
1802 public static int test_3_checked_cast_un () {
1803 ulong i
= 0x8000000034000000;
1807 checked { j = (long)i; }
1808 } catch (OverflowException
) {
1817 public static int test_4_checked_cast () {
1821 unchecked { i = (long)0x8000000034000000;}
;
1823 checked { j = (ulong)i; }
1824 } catch (OverflowException
) {
1833 static readonly int[] mul_dim_results
= new int[] {
1834 0, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8,
1835 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, 1, 5, 1, 6, 1, 7, 1, 8,
1839 5, 0, 5, 1, 5, 2, 5, 3, 5, 4, 5, 5, 5, 6, 5, 7, 5, 8,
1840 6, 0, 6, 1, 6, 2, 6, 3, 6, 4, 6, 5, 6, 6, 6, 7, 6, 8,
1841 7, 0, 7, 1, 7, 2, 7, 3, 7, 4, 7, 5, 7, 6, 7, 7, 7, 8,
1844 public static int test_0_multi_dim_array_access () {
1845 int [,] a
= System
.Array
.CreateInstance (typeof (int),
1846 new int [] {3,6}
, new int [] {2,2 }
) as int[,];
1849 for (x
= 0; x
< 8; ++x
) {
1850 for (y
= 0; y
< 9; ++y
) {
1851 bool got_ex
= false;
1858 if (result_idx
>= mul_dim_results
.Length
)
1860 if (mul_dim_results
[result_idx
] != x
|| mul_dim_results
[result_idx
+ 1] != y
) {
1861 return result_idx
+ 1;
1867 if (result_idx
== mul_dim_results
.Length
)
1872 static void helper_out_obj (out object o
) {
1873 o
= (object)"buddy";
1876 static void helper_out_string (out string o
) {
1880 public static int test_2_array_mismatch () {
1881 string[] a
= { "hello", "world" }
;
1883 bool passed
= false;
1886 helper_out_obj (out b
[1]);
1887 } catch (ArrayTypeMismatchException
) {
1892 helper_out_string (out a
[1]);
1893 if (a
[1] != "buddy")
1898 public static int test_0_ovf1 () {
1903 ulong a
= UInt64
.MaxValue
- 1;
1912 public static int test_1_ovf2 () {
1917 ulong a
= UInt64
.MaxValue
;
1926 public static int test_0_ovf3 () {
1929 long a
= Int64
.MaxValue
- 1;
1940 public static int test_1_ovf4 () {
1943 long a
= Int64
.MaxValue
;
1954 public static int test_0_ovf5 () {
1957 ulong a
= UInt64
.MaxValue
- 1;
1968 public static int test_1_ovf6 () {
1971 ulong a
= UInt64
.MaxValue
;
1982 public static int test_0_ovf7 () {
1985 long a
= Int64
.MinValue
+ 1;
1996 public static int test_1_ovf8 () {
1999 long a
= Int64
.MinValue
;
2010 public static int test_0_ovf9 () {
2013 ulong a
= UInt64
.MinValue
+ 1;
2024 public static int test_1_ovf10 () {
2027 ulong a
= UInt64
.MinValue
;
2038 public static int test_0_ovf11 () {
2041 int a
= Int32
.MinValue
+ 1;
2052 public static int test_1_ovf12 () {
2055 int a
= Int32
.MinValue
;
2066 public static int test_0_ovf13 () {
2080 public static int test_1_ovf14 () {
2094 public static int test_0_ovf15 () {
2108 public static int test_1_ovf16 () {
2122 public static int test_0_ovf17 () {
2134 public static int test_0_ovf18 () {
2148 public static int test_1_ovf19 () {
2162 public static int test_0_ovf20 () {
2167 ulong a
= 0xffffffffff;
2168 ulong t
= a
*0x0ffffff;
2176 public static int test_1_ovf21 () {
2179 ulong a
= 0xffffffffff;
2182 ulong t
= a
*0x0fffffff;
2190 public static int test_1_ovf22 () {
2193 long a
= Int64
.MinValue
;
2205 public static int test_1_ovf23 () {
2209 long b
= Int64
.MinValue
;
2221 public static int i
;
2224 throw new Exception ("Ugh!");
2227 public static int DoSomething () {
2232 public static int test_0_exception_in_cctor () {
2234 Broken
.DoSomething ();
2236 catch (TypeInitializationException
) {
2237 // This will only happen once even if --regression is used
2242 public static int test_5_regalloc () {
2246 for (i
= 0; i
< 10; ++i
) {
2248 throw new Exception ();
2256 // Check that variables written in catch clauses are volatile
2259 throw new Exception ();
2270 throw new Exception ();
2284 public static void rethrow () {
2286 throw new ApplicationException();
2287 } catch (ApplicationException
) {
2289 throw new OverflowException();
2290 } catch (Exception
) {
2296 // Test that a rethrow rethrows the correct exception
2297 public static int test_0_rethrow_nested () {
2300 } catch (OverflowException
) {
2302 } catch (Exception
) {
2308 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
2309 public static void rethrow1 () {
2310 throw new Exception ();
2313 [MethodImplAttribute (MethodImplOptions
.NoInlining
)]
2314 public static void rethrow2 () {
2316 /* This disables tailcall opts */
2317 Console
.WriteLine ();
2320 [Category ("!BITCODE")]
2321 public static int test_0_rethrow_stacktrace () {
2322 // Check that rethrowing an exception preserves the original stack trace
2327 catch (Exception ex
) {
2328 // Check that each catch clause has its own exception variable
2329 // If not, the throw below will overwrite the exception used
2332 throw new DivideByZeroException ();
2334 catch (Exception foo
) {
2340 catch (Exception ex
) {
2341 if (ex
.StackTrace
.IndexOf ("rethrow2") != -1)
2349 class Face
: IFace
{}
2351 public static int test_1_array_mismatch_2 () {
2353 object [] o
= new Face
[1];
2356 } catch (ArrayTypeMismatchException
) {
2361 public static int test_1_array_mismatch_3 () {
2363 object [] o
= new IFace
[1];
2366 } catch (ArrayTypeMismatchException
) {
2371 public static int test_1_array_mismatch_4 () {
2373 object [][] o
= new Face
[5] [];
2374 o
[0] = new object [5];
2377 } catch (ArrayTypeMismatchException
) {
2382 public static int test_0_array_size () {
2387 int[,] mem2
= new int [Int32
.MaxValue
, Int32
.MaxValue
];
2389 catch (OutOfMemoryException e
) {
2399 int i
, j
, k
, l
, m
, n
;
2402 static IntPtr
[] addr
;
2404 static unsafe void throw_func (int i
, S s
) {
2405 addr
[i
] = new IntPtr (&i
);
2406 throw new Exception ();
2409 /* Test that arguments are correctly popped off the stack during unwinding */
2410 /* FIXME: Fails on x86 when llvm is enabled (#5432) */
2412 public static int test_0_stack_unwind () {
2413 addr = new IntPtr [1000];
2415 for (int j = 0; j < 1000; j++) {
2422 return (addr [0].ToInt64 () - addr [100].ToInt64 () < 100) ? 0 : 1;
2426 static unsafe void get_sp (int i
) {
2427 addr
[i
] = new IntPtr (&i
);
2430 /* Test that the arguments to the throw trampoline are correctly popped off the stack */
2431 public static int test_0_throw_unwind () {
2432 addr
= new IntPtr
[1000];
2434 for (int j
= 0; j
< 1000; j
++) {
2437 throw new Exception ();
2442 return (addr
[0].ToInt64 () - addr
[100].ToInt64 () < 100) ? 0 : 1;
2445 public static int test_0_regress_73242 () {
2446 int [] arr
= new int [10];
2447 for (int i
= 0; i
< 10; ++i
)
2450 throw new Exception ();
2457 public static int test_0_nullref () {
2461 } catch (NullReferenceException e
) {
2467 public int amethod () {
2471 public static int test_0_nonvirt_nullref_at_clause_start () {
2472 ExceptionTests t
= null;
2475 } catch (NullReferenceException
) {
2482 public static int throw_only () {
2483 throw new Exception ();
2486 [MethodImpl(MethodImplOptions
.NoInlining
)]
2487 public static int throw_only2 () {
2488 return throw_only ();
2491 public static int test_0_inline_throw_only () {
2493 return throw_only2 ();
2495 catch (Exception ex
) {
2500 public static string GetText (string s
) {
2504 public static int throw_only_gettext () {
2505 throw new Exception (GetText ("FOO"));
2508 public static int test_0_inline_throw_only_gettext () {
2511 o
= throw_only_gettext ();
2513 catch (Exception ex
) {
2517 return o
!= null ? 0 : 1;
2521 public static int test_0_throw_to_branch_opt_outer_clause () {
2526 string [] files
= new string[1];
2528 string s
= files
[2];
2535 return (i
== 1) ? 0 : 1;
2539 public static int test_0_try_inside_finally_cmov_opt () {
2540 bool Reconect
= false;
2542 object o
= new object ();
2546 catch (Exception ExCon
) {
2552 catch (Exception Last
) {
2556 if (Reconect
== true) {
2559 catch (Exception ex
) {
2567 public static int test_0_inline_throw () {
2576 // for llvm, the end bblock is unreachable
2577 public static int inline_throw1 (int i
) {
2579 throw new Exception ();
2581 return inline_throw2 (i
);
2584 public static int inline_throw2 (int i
) {
2585 throw new Exception ();
2589 public static int test_0_lmf_filter () {
2591 // The invoke calls a runtime-invoke wrapper which has a filter clause
2593 typeof (ExceptionTests
).GetMethod ("lmf_filter").Invoke (null, new object [] { }
);
2595 typeof (Tests
).GetMethod ("lmf_filter").Invoke (null, new object [] { }
);
2597 } catch (TargetInvocationException
) {
2602 public static void lmf_filter () {
2607 throw new NotImplementedException ();
2611 public static void Connect () {
2613 throw new Exception();
2616 public static void Stop () {
2624 private static void do_raise () {
2625 throw new System
.Exception ();
2628 private static int int_func (int i
) {
2633 public static int test_8_local_deadce_causes () {
2640 } catch (System
.Exception
) {
2646 public static int test_0_except_opt_two_clauses () {
2649 uint ui
= (uint)size
;
2652 uint v
= ui
* (uint)4;
2654 } catch (OverflowException e
) {
2656 } catch (Exception
) {
2665 public virtual long Method()
2667 throw new Exception();
2672 public static int test_100_long_vars_in_clauses_initlocals_opt () {
2673 Child c
= new Child();
2683 public object AnObj
;
2686 public static void DoSomething (ref object o
) {
2689 public static int test_0_ldflda_null () {
2693 DoSomething (ref a
.AnObj
);
2694 } catch (NullReferenceException
) {
2705 public static Foo
* pFoo
;
2708 /* MS.NET doesn't seem to throw in this case */
2709 public unsafe static int test_0_ldflda_null_pointer () {
2710 int* pi
= &Foo
.pFoo
->i
;
2715 static int test_0_try_clause_in_finally_clause_regalloc () {
2716 // Fill up registers with values
2717 object a
= new object ();
2718 object[] arr1
= new object [1];
2719 object[] arr2
= new object [1];
2720 object[] arr3
= new object [1];
2721 object[] arr4
= new object [1];
2722 object[] arr5
= new object [1];
2724 for (int i
= 0; i
< 10; ++i
)
2726 for (int i
= 0; i
< 10; ++i
)
2728 for (int i
= 0; i
< 10; ++i
)
2730 for (int i
= 0; i
< 10; ++i
)
2732 for (int i
= 0; i
< 10; ++i
)
2737 try_clause_in_finally_clause_regalloc_inner (out res
);
2738 } catch (Exception
) {
2743 public static object Throw () {
2744 for (int i
= 0; i
< 10; ++i
)
2746 throw new Exception ();
2749 static void try_clause_in_finally_clause_regalloc_inner (out int res
) {
2755 } catch (Exception
) {
2756 /* Make sure this doesn't branch to the finally */
2757 throw new DivideByZeroException ();
2760 /* Make sure o is register allocated */
2773 } catch (DivideByZeroException
) {
2778 public static bool t_1835_inner () {
2780 if (a
) throw new Exception();
2784 [MethodImpl(MethodImplOptions
.NoInlining
)]
2785 public static bool t_1835_inner_2 () {
2786 bool b
= t_1835_inner ();
2790 public static int test_0_inline_retval_throw_in_branch_1835 () {
2799 static bool finally_called
= false;
2801 static void regress_30472 (int a
, int b
) {
2806 finally_called
= true;
2811 public static int test_0_regress_30472 () {
2812 finally_called
= false;
2814 regress_30472 (Int32
.MaxValue
- 1, 2);
2815 } catch (Exception ex
) {
2817 return finally_called
? 0 : 1;
2820 static int array_len_1
= 1;
2822 public static int test_0_bounds_check_negative_constant () {
2824 byte[] arr
= new byte [array_len_1
];
2830 byte[] arr
= new byte [array_len_1
];
2838 public static int test_0_string_bounds_check_negative_constant () {
2848 public class MyException
: Exception
{
2849 public int marker
= 0;
2850 public string res
= "";
2852 public MyException (String res
) {
2856 public bool FilterWithoutState () {
2857 return this.marker
== 0x666;
2860 public bool FilterWithState () {
2861 bool ret
= this.marker
== 0x566;
2862 this.marker
+= 0x100;
2866 public bool FilterWithStringState () {
2867 bool ret
= this.marker
== 0x777;
2868 this.res
= "fromFilter_" + this.res
;
2873 [Category ("!BITCODE")]
2874 public static int test_1_basic_filter_catch () {
2876 MyException e
= new MyException ("");
2879 } catch (MyException ex
) when (ex
.marker
== 0x1337) {
2885 [Category ("!BITCODE")]
2886 public static int test_1234_complicated_filter_catch () {
2887 string res
= "init";
2889 MyException e
= new MyException (res
);
2894 } catch (MyException ex
) when (ex
.FilterWithoutState ()) {
2895 res
= "WRONG_" + res
;
2898 res
= "innerFinally_" + res
;
2900 } catch (MyException ex
) when (ex
.FilterWithState ()) {
2901 res
= "2ndcatch_" + res
;
2903 // "2ndcatch_innerFinally_init"
2904 // Console.WriteLine ("res1: " + res);
2907 } catch (MyException ex
) when (ex
.FilterWithStringState ()) {
2908 res
= "fwos_" + ex
.res
;
2910 res
= "outerFinally_" + res
;
2912 // Console.WriteLine ("res2: " + res);
2913 return "outerFinally_fwos_fromFilter_2ndcatch_innerFinally_init" == res
? 1234 : 0;
2916 public struct FooStruct
2918 public long Part1 { get; }
2919 public long Part2 { get; }
2921 public byte Part3 { get; }
2924 [MethodImpl( MethodImplOptions
.NoInlining
)]
2925 private static bool ExceptionFilter( byte x
, FooStruct item
) => true;
2927 [Category ("!BITCODE")]
2928 public static int test_0_filter_caller_area () {
2930 throw new Exception();
2932 catch (Exception
) when (ExceptionFilter (default(byte), default (FooStruct
))) {
2937 public static int test_0_signed_ct_div () {
2939 bool divide_by_zero
= false;
2940 bool overflow
= false;
2946 } catch (OverflowException
) {
2954 } catch (DivideByZeroException
) {
2955 divide_by_zero
= true;
2957 if (!divide_by_zero
)
2960 if ((n
/ 35) != -61356675)
2962 if ((n
/ -35) != 61356675)
2964 n
= -(n
+ 1); /* MaxValue */
2965 if ((n
/ 35) != 61356675)
2967 if ((n
/ -35) != -61356675)
2973 public static int test_0_unsigned_ct_div () {
2974 uint n
= 4294967295;
2975 bool divide_by_zero
= false;
2979 } catch (DivideByZeroException
) {
2980 divide_by_zero
= true;
2983 if (!divide_by_zero
)
2986 if ((n
/ 35) != 122713351)
2994 class ExceptionTests
: Tests