From f78c367d3193099a86bbd4bd245ee0f0bf8dd930 Mon Sep 17 00:00:00 2001 From: Aaron Robinson Date: Thu, 25 Apr 2024 11:15:59 -0700 Subject: [PATCH] Add test for boxing byreflike fail. (#101458) * Check if type is compatible right before emitting box * Add test for using byreflike type in isinst expressions. --- .../generics/ByRefLike/InvalidCSharp.il | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/src/tests/Loader/classloader/generics/ByRefLike/InvalidCSharp.il b/src/tests/Loader/classloader/generics/ByRefLike/InvalidCSharp.il index 2f3f65d1a1995..8480a5cf45207 100644 --- a/src/tests/Loader/classloader/generics/ByRefLike/InvalidCSharp.il +++ b/src/tests/Loader/classloader/generics/ByRefLike/InvalidCSharp.il @@ -149,6 +149,41 @@ ret } + .method public hidebysig + instance bool BoxBranchToOther(!T) cil managed + { + ldarg.1 + // Begin sequence + box !!U + brfalse.s NEXT_1 + // End sequence + NEXT_1: + + ldarg.1 + // Begin sequence + box !!U + brfalse NEXT_2 + // End sequence + NEXT_2: + + ldarg.1 + // Begin sequence + box !!U + brtrue.s NEXT_3 + // End sequence + NEXT_3: + + ldarg.1 + // Begin sequence + box !!U + brtrue NEXT_4 + // End sequence + NEXT_4: + + ldc.i4.1 + ret + } + .method public hidebysig instance bool BoxBranch_WithSideEffects(!T&) cil managed { @@ -284,6 +319,26 @@ ret } + .method public hidebysig + instance bool BoxIsinstBranch_UsingTypeConstraints(class InvalidCSharp.EmptyInterface) cil managed + { + .locals init ( + [0] !!U + ) + ldarg.1 + isinst !!U + brfalse.s NOT_U + ldarg.1 + isinst !!U + unbox.any !!U + stloc.0 + ldc.i4.0 + ret + NOT_U: + ldc.i4.1 + ret + } + .method public hidebysig instance bool AllocArrayOfT() cil managed aggressiveinlining { @@ -406,6 +461,19 @@ { } +.class public auto ansi beforefieldinit InvalidCSharp.ClassWithInterface + extends [System.Runtime]System.Object + implements InvalidCSharp.EmptyInterface +{ + .method public hidebysig specialname rtspecialname + instance void .ctor () cil managed + { + ldarg.0 + call instance void [System.Runtime]System.Object::.ctor() + ret + } +} + // Generic substitution of allow-byreflike with allow-byreflike .class interface public auto ansi abstract InvalidCSharp.GenericDerivedInterface_OverByRef`1 implements class InvalidCSharp.GenericInterface_Over`1 @@ -651,6 +719,18 @@ call instance bool valuetype InvalidCSharp.GenericByRefLike_Over`1::BoxBranch(!0) pop + ldloca.s 0 + ldloc 0 + ldfld !0 valuetype InvalidCSharp.GenericByRefLike_Over`1::Field + call instance bool valuetype InvalidCSharp.GenericByRefLike_Over`1::BoxBranchToOther(!0) + pop + + ldloca.s 0 + ldloc 0 + ldfld !0 valuetype InvalidCSharp.GenericByRefLike_Over`1::Field + call instance bool valuetype InvalidCSharp.GenericByRefLike_Over`1::BoxBranchToOther(!0) + pop + ldloca.s 0 ldloca.s 0 ldflda !0 valuetype InvalidCSharp.GenericByRefLike_Over`1::Field @@ -695,6 +775,11 @@ ldloca.s 0 ldflda !0 valuetype InvalidCSharp.GenericByRefLike_Over`1::Field call instance bool valuetype InvalidCSharp.GenericByRefLike_Over`1::BoxIsinstBranch_WithSideEffects(!0&) + pop + + ldloca.s 0 + newobj instance void InvalidCSharp.ClassWithInterface::.ctor() + call instance bool valuetype InvalidCSharp.GenericByRefLike_Over`1::BoxIsinstBranch_UsingTypeConstraints(class InvalidCSharp.EmptyInterface) ret }