summaryrefslogtreecommitdiff
path: root/tests/src/Loader/classloader/regressions/vsw529206/vsw529206ModuleCctor.cs
blob: 9bc966a1da4522c51627cbc79ae3d3331e179bbb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

// regression test for VSWhidbey 529206 for throwing TypeInitialization inside module .cctor
// We were appending every time the callstack and using the same exception object.
// Now we still use the same object, but callstack is cleared every time.


using System;
using System.Runtime.CompilerServices;

class Test
{
	public static bool pass;
    	
	[MethodImpl(MethodImplOptions.NoInlining)]
	public static void RunTest()
	{
		// TRIGGER: static field access, ref type
		TriggerModuleCctorClass.intStatic = 5;
	}


	[MethodImpl(MethodImplOptions.NoInlining)]
	public static void RunTest2()
	{
		// TRIGGER: static field access, ref type
		TriggerModuleCctorClass.intStatic = 5;
	}

    	public static int Main()
    	{
    		pass = true;
			
    		try
		{
			RunTest();
		
			Console.WriteLine("Did not catch expected TypeInitializationException exception");
			pass = false;
		}
		catch (TypeInitializationException e)
		{
			Console.WriteLine("Caught expected exception 1st time\n" + e);
			
		}
		catch (Exception e)
		{
			Console.WriteLine("Caught unexpected exception 1st time: " + e);
			pass = false;
		}

		
		try
		{
			RunTest2();
			
			Console.WriteLine("Did not catch expected TypeInitializationException exception");
			pass = false;
		}
		catch (TypeInitializationException e )
		{
			Console.WriteLine("Caught expected exception 2nd time\n" + e);
		
			// if this string is found in the callstack it means we're appending callstack 
			// instead of having a new one each time.
			if (e.StackTrace.IndexOf("at Test.RunTest()") != -1)
			{
				Console.WriteLine("2nd time: Incorrect stack trace");
				pass = false;
			}

		}
		catch (Exception e)
		{
			Console.WriteLine("Caught unexpected exception 2nd time: " + e);
			pass = false;

		}

		if (pass)
		{
			Console.WriteLine("PASS");
			return 100;
		}
		else
		{
			Console.WriteLine("FAIL");
			return 101;
		}
    	}
}