// 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. // using System; public struct ValX0 { } public struct ValY0 { } public struct ValX1 { } public struct ValY1 { } public struct ValX2 { } public struct ValY2 { } public struct ValX3 { } public struct ValY3 { } public class RefX0 { } public class RefY0 { } public class RefX1 { } public class RefY1 { } public class RefX2 { } public class RefY2 { } public class RefX3 { } public class RefY3 { } public class GenBase { public T Fld1; public U Fld2; public GenBase(T fld1, U fld2) { Fld1 = fld1; Fld2 = fld2; } public bool InstVerify(System.Type t1, System.Type t2) { bool result = true; if (!(Fld1.GetType().Equals(t1))) { result = false; Console.WriteLine("Failed to verify type of Fld1 in: " + typeof(GenBase)); } if (!(Fld2.GetType().Equals(t2))) { result = false; Console.WriteLine("Failed to verify type of Fld2 in: " + typeof(GenBase)); } return result; } } public class Gen : GenBase { public Gen(T fld1) : base(fld1, 1) { } public bool InstVerify(System.Type t1) { return base.InstVerify(t1, typeof(int)); } } public class Test { public static int counter = 0; public static bool result = true; public static void Eval(bool exp) { counter++; if (!exp) { result = exp; Console.WriteLine("Test Failed at location: " + counter); } } public static int Main() { Eval((new Gen(new int())).InstVerify(typeof(int))); Eval((new Gen(new double())).InstVerify(typeof(double))); Eval((new Gen("string")).InstVerify(typeof(string))); Eval((new Gen(new object())).InstVerify(typeof(object))); Eval((new Gen(new Guid())).InstVerify(typeof(Guid))); Eval((new Gen(new int[1])).InstVerify(typeof(int[]))); Eval((new Gen(new double[1, 1])).InstVerify(typeof(double[,]))); Eval((new Gen(new string[1][][])).InstVerify(typeof(string[][][]))); Eval((new Gen(new object[1, 1, 1, 1])).InstVerify(typeof(object[, , ,]))); Eval((new Gen(new Guid[1][, , ,][])).InstVerify(typeof(Guid[][, , ,][]))); Eval((new Gen[]>(new RefX1[] { })).InstVerify(typeof(RefX1[]))); Eval((new Gen[,]>(new RefX1[1, 1])).InstVerify(typeof(RefX1[,]))); Eval((new Gen[][][]>(new RefX1[1][][])).InstVerify(typeof(RefX1[][][]))); Eval((new Gen[, , ,]>(new RefX1[1, 1, 1, 1])).InstVerify(typeof(RefX1[, , ,]))); Eval((new Gen[][, , ,][]>(new RefX1[1][, , ,][])).InstVerify(typeof(RefX1[][, , ,][]))); Eval((new Gen[]>(new RefX2[] { })).InstVerify(typeof(RefX2[]))); Eval((new Gen[,]>(new RefX2[1, 1])).InstVerify(typeof(RefX2[,]))); Eval((new Gen[][][]>(new RefX2[1][][])).InstVerify(typeof(RefX2[][][]))); Eval((new Gen[, , ,]>(new RefX2[1, 1, 1, 1])).InstVerify(typeof(RefX2[, , ,]))); Eval((new Gen[][, , ,][]>(new RefX2[1][, , ,][])).InstVerify(typeof(RefX2[][, , ,][]))); Eval((new Gen[]>(new ValX1[] { })).InstVerify(typeof(ValX1[]))); Eval((new Gen[,]>(new ValX1[1, 1])).InstVerify(typeof(ValX1[,]))); Eval((new Gen[][][]>(new ValX1[1][][])).InstVerify(typeof(ValX1[][][]))); Eval((new Gen[, , ,]>(new ValX1[1, 1, 1, 1])).InstVerify(typeof(ValX1[, , ,]))); Eval((new Gen[][, , ,][]>(new ValX1[1][, , ,][])).InstVerify(typeof(ValX1[][, , ,][]))); Eval((new Gen[]>(new ValX2[] { })).InstVerify(typeof(ValX2[]))); Eval((new Gen[,]>(new ValX2[1, 1])).InstVerify(typeof(ValX2[,]))); Eval((new Gen[][][]>(new ValX2[1][][])).InstVerify(typeof(ValX2[][][]))); Eval((new Gen[, , ,]>(new ValX2[1, 1, 1, 1])).InstVerify(typeof(ValX2[, , ,]))); Eval((new Gen[][, , ,][]>(new ValX2[1][, , ,][])).InstVerify(typeof(ValX2[][, , ,][]))); Eval((new Gen>(new RefX1())).InstVerify(typeof(RefX1))); Eval((new Gen>>(new RefX1>())).InstVerify(typeof(RefX1>))); Eval((new Gen>(new RefX2())).InstVerify(typeof(RefX2))); Eval((new Gen>(new RefX3())).InstVerify(typeof(RefX3))); Eval((new Gen>>(new RefX1>())).InstVerify(typeof(RefX1>))); Eval((new Gen>>>(new RefX1>>())).InstVerify(typeof(RefX1>>))); Eval((new Gen>>>>(new RefX1>>>())).InstVerify(typeof(RefX1>>>))); Eval((new Gen>>(new RefX1>())).InstVerify(typeof(RefX1>))); Eval((new Gen, RefX3>>>, RefX2, RefX3>>>>>(new RefX2, RefX3>>>, RefX2, RefX3>>>>())).InstVerify(typeof(RefX2, RefX3>>>, RefX2, RefX3>>>>))); Eval((new Gen, RefX2, RefX3>>(new RefX3, RefX2, RefX3>())).InstVerify(typeof(RefX3, RefX2, RefX3>))); Eval((new Gen>(new ValX1())).InstVerify(typeof(ValX1))); Eval((new Gen>>(new ValX1>())).InstVerify(typeof(ValX1>))); Eval((new Gen>(new ValX2())).InstVerify(typeof(ValX2))); Eval((new Gen>(new ValX3())).InstVerify(typeof(ValX3))); Eval((new Gen>>(new ValX1>())).InstVerify(typeof(ValX1>))); Eval((new Gen>>>(new ValX1>>())).InstVerify(typeof(ValX1>>))); Eval((new Gen>>>>(new ValX1>>>())).InstVerify(typeof(ValX1>>>))); Eval((new Gen>>(new ValX1>())).InstVerify(typeof(ValX1>))); Eval((new Gen, ValX3>>>, ValX2, ValX3>>>>>(new ValX2, ValX3>>>, ValX2, ValX3>>>>())).InstVerify(typeof(ValX2, ValX3>>>, ValX2, ValX3>>>>))); Eval((new Gen, ValX2, ValX3>>(new ValX3, ValX2, ValX3>())).InstVerify(typeof(ValX3, ValX2, ValX3>))); if (result) { Console.WriteLine("Test Passed"); return 100; } else { Console.WriteLine("Test Failed"); return 1; } } }