blob: a7ee0ef60afa5ad270ba610721609ccbac0c1da4 (
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
94
95
96
97
|
// Compiler options: -unsafe
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Microsoft.CSharp.RuntimeBinder;
class Helper
{
public unsafe static int* Foo (int i)
{
return null;
}
}
class Tester
{
#pragma warning disable 169
void NonInvocable ()
{
AssertError (
() => {
dynamic d = 1;
d ();
}, "Cannot invoke a non-delegate type `int'");
}
void Using_1 ()
{
AssertError (
() => {
using (dynamic d = 1) { }
}, "Cannot implicitly convert type `int' to `System.IDisposable'");
}
void Unsafe_1 ()
{
dynamic d = 1;
AssertError (
() => Helper.Foo (d),
"Pointers and fixed size buffers cannot be used in a dynamic context");
}
void NullableConversion ()
{
dynamic d = 1;
AssertError (
() => {
dynamic b = false;
byte? b2 = null;
b &= b2;
}, "Operator `&=' cannot be applied to operands of type `bool' and `byte?'");
}
#pragma warning restore 169
static void AssertError (Action a, string msg)
{
try {
a ();
} catch (RuntimeBinderException e) {
if (e.Message != msg)
throw new ApplicationException ("Expected error message: " + e.Message);
return;
}
throw new ApplicationException ("Expected error");
}
static bool RunTest (MethodInfo test)
{
Console.Write ("Running test {0, -25}", test.Name);
try {
test.Invoke (new Tester (), null);
Console.WriteLine ("OK");
return true;
} catch (Exception e) {
Console.WriteLine ("FAILED");
Console.WriteLine (e.InnerException.Message);
return false;
}
}
public static int Main ()
{
var tests = from test in typeof (Tester).GetMethods (BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly)
where test.GetParameters ().Length == 0
orderby test.Name
select RunTest (test);
int failures = tests.Count (a => !a);
Console.WriteLine (failures + " tests failed");
return failures;
}
}
|