[Tailcall] Bring coreclr tests for tail calls to Mono source tree (#7204)
[mono-project.git] / mono / tests / tailcall / coreclr / JIT / Methodical / nonvirtualcall / tailcall.cs
blob9d84ef16732577bf08de867703af5ce48e1413ad
1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
5 using System;
6 using System.IO;
7 using System.Runtime.CompilerServices;
9 class ApplicationException : Exception
11 public ApplicationException(string message) : base(message) { }
14 namespace Test
16 public abstract class Base
18 public abstract string AbstractFinal();
19 public abstract string AbstractOverrideFinal();
20 public abstract string AbstractOverrideOverride();
21 public abstract string AbstractOverrideNil();
23 public virtual string VirtualFinal()
25 return "Base.VirtualFinal";
28 public virtual string VirtualNilFinal()
30 return "Base.VirtualNilFinal";
33 public virtual string VirtualOverrideFinal()
35 return "Base.VirtualOverrideFinal";
37 public virtual string VirtualNilOverride()
39 return "Base.VirtualNilOverride";
41 public virtual string VirtualNilNil()
43 return "Base.VirtualNilNil";
45 public virtual string VirtualOverrideOverride()
47 return "Base.VirtualOverrideOverride";
49 public virtual string VirtualOverrideNil()
51 return "Base.VirtualOverrideNil";
55 public class Child : Base
57 public sealed override string AbstractFinal()
59 return "Child.AbstractFinal";
61 public string CallAbstractFinal()
63 return AbstractFinal();
65 public override string AbstractOverrideFinal()
67 return "Child.AbstractOverrideFinal";
69 public override string AbstractOverrideOverride()
71 return "Child.AbstractOverrideOverride";
73 public override string AbstractOverrideNil()
75 return "Child.AbstractOverrideNil";
77 public string CallAbstractOverrideNil()
79 return AbstractOverrideNil();
81 public sealed override string VirtualFinal()
83 return "Child.VirtualFinal";
85 public string CallVirtualFinal()
87 return VirtualFinal();
89 public override string VirtualOverrideFinal()
91 return "Child.VirtualOverrideFinal";
93 public override string VirtualOverrideOverride()
95 return "Child.VirtualOverrideOverride";
97 public override string VirtualOverrideNil()
99 return "Child.VirtualOverrideNil";
101 public string CallVirtualOverrideNil()
103 return VirtualOverrideNil();
107 public class GrandChild : Child
109 public sealed override string AbstractOverrideFinal()
111 return "GrandChild.AbstractOverrideFinal";
114 public string CallAbstractOverrideFinal()
116 return AbstractOverrideFinal();
119 public override string AbstractOverrideOverride()
121 return "GrandChild.AbstractOverrideOverride";
124 public string CallAbstractOverrideOverride()
126 return AbstractOverrideOverride();
129 public sealed override string VirtualNilFinal()
131 return "GrandChild.VirtualNilFinal";
134 public string CallVirtualNilFinal()
136 return VirtualNilFinal();
139 public sealed override string VirtualOverrideFinal()
141 return "GrandChild.VirtualOverrideFinal";
144 public string CallVirtualOverrideFinal()
146 return VirtualOverrideFinal();
149 public override string VirtualOverrideOverride()
151 return "GrandChild.VirtualOverrideOverride";
154 public string CallVirtualOverrideOverride()
156 return VirtualOverrideOverride();
159 public override string VirtualNilOverride()
161 return "GrandChild.VirtualNilOverride";
164 public string CallVirtualNilOverride()
166 return VirtualNilOverride();
169 public void TestGrandChild()
171 Console.WriteLine("Call from inside GrandChild");
172 Assert.AreEqual("Child.AbstractFinal", CallAbstractFinal());
173 Assert.AreEqual("GrandChild.AbstractOverrideFinal", CallAbstractOverrideFinal());
174 Assert.AreEqual("GrandChild.AbstractOverrideOverride", CallAbstractOverrideOverride());
175 Assert.AreEqual("Child.AbstractOverrideNil", CallAbstractOverrideNil());
176 Assert.AreEqual("Child.VirtualFinal", CallVirtualFinal());
177 Assert.AreEqual("GrandChild.VirtualOverrideFinal", CallVirtualOverrideFinal());
178 Assert.AreEqual("GrandChild.VirtualOverrideOverride", CallVirtualOverrideOverride());
179 Assert.AreEqual("Child.VirtualOverrideNil", CallVirtualOverrideNil());
183 public static class Program
185 public static void CallFromInsideGrandChild()
187 GrandChild child = new GrandChild();
188 child.TestGrandChild();
191 public static int Main(string[] args)
195 CallFromInsideGrandChild();
197 Console.WriteLine("Test SUCCESS");
198 return 100;
200 catch (Exception ex)
202 Console.WriteLine(ex);
203 Console.WriteLine("Test FAILED");
204 return 101;
209 public static class Assert
211 public static void AreEqual(string left, string right)
213 if (String.IsNullOrEmpty(left))
214 throw new ArgumentNullException("left");
215 if (string.IsNullOrEmpty(right))
216 throw new ArgumentNullException("right");
217 if (left != right)
219 string message = String.Format("[[{0}]] != [[{1}]]", left, right);
220 throw new ApplicationException(message);