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
94
95
96
97
98
99
100
|
using Mono.Linker.Tests.Cases.Expectations.Assertions;
using System.Linq.Expressions;
using System;
using System.Linq;
using Mono.Linker.Tests.Cases.Expectations.Metadata;
using System.Runtime.CompilerServices;
namespace Mono.Linker.Tests.Cases.Reflection
{
[Reference ("System.Core.dll")]
public class ExpressionNewType
{
public static void Main ()
{
Branch_SystemTypeValueNode (0);
Branch_SystemTypeValueNode (1);
Branch_NullValueNode ();
Branch_MethodParameterValueNode (typeof (C));
Branch_UnrecognizedPatterns ();
}
[Kept]
static void Branch_NullValueNode ()
{
Expression.New (5 + 7 == 12 ? null : typeof (RemovedType));
}
#region RecognizedReflectionAccessPatterns
[RecognizedReflectionAccessPattern (
typeof (Expression), nameof (Expression.New), new Type[] { typeof (Type) }, typeof (A), ".ctor", new Type[0])]
[RecognizedReflectionAccessPattern (
typeof (Expression), nameof (Expression.New), new Type[] { typeof (Type) }, typeof (B), ".ctor", new Type[0])]
[Kept]
static void Branch_SystemTypeValueNode (int i)
{
Type T = (Type) null;
switch (i) {
case 0:
T = typeof (A);
break;
case 1:
T = typeof (B);
break;
default:
break;
}
Expression.New (T);
}
#endregion
#region UnrecognizedReflectionAccessPatterns
[UnrecognizedReflectionAccessPattern (typeof (Expression), nameof (Expression.New), new Type[] { typeof (Type) }, messageCode: "IL2067")]
[Kept]
static void Branch_MethodParameterValueNode (Type T)
{
Expression.New (T);
}
[UnrecognizedReflectionAccessPattern (typeof (Expression), nameof (Expression.New), new Type[] { typeof (Type) }, messageCode: "IL2072")]
[UnrecognizedReflectionAccessPattern (typeof (Expression), nameof (Expression.New), new Type[] { typeof (Type) }, messageCode: "IL2072")]
[Kept]
static void Branch_UnrecognizedPatterns ()
{
Expression.New (Type.GetType ("RemovedType"));
Expression.New (GetType ());
}
#endregion
#region Helpers
[Kept]
class A
{
[Kept]
A () { }
}
[Kept]
class B
{
[Kept]
B () { }
}
[Kept]
class C { }
[Kept]
class D { }
class RemovedType { }
[Kept]
static Type GetType ()
{
return typeof (D);
}
#endregion
}
}
|