More conversion tweaks for dynamic in using statement
authorMarek Safar <marek.safar@gmail.com>
Thu, 14 Oct 2010 09:51:17 +0000 (10:51 +0100)
committerMarek Safar <marek.safar@gmail.com>
Thu, 14 Oct 2010 09:52:02 +0000 (10:52 +0100)
mcs/errors/cs0029-14.cs [new file with mode: 0644]
mcs/errors/cs0509-5.cs [new file with mode: 0644]
mcs/mcs/statement.cs
mcs/mcs/typespec.cs
mcs/tests/dtest-error-01.cs
mcs/tests/test-577.cs [new file with mode: 0644]
mcs/tests/ver-il-dmcs.xml

diff --git a/mcs/errors/cs0029-14.cs b/mcs/errors/cs0029-14.cs
new file mode 100644 (file)
index 0000000..e0141e9
--- /dev/null
@@ -0,0 +1,10 @@
+// CS0029: Cannot implicitly convert type `int' to `System.IDisposable'
+// Line: 8
+
+class A
+{
+       public static void Main ()
+       {
+               System.IDisposable id = 1;
+       }
+}
diff --git a/mcs/errors/cs0509-5.cs b/mcs/errors/cs0509-5.cs
new file mode 100644 (file)
index 0000000..25c7626
--- /dev/null
@@ -0,0 +1,6 @@
+// CS0509: `X': cannot derive from sealed type `int'
+// Line: 4
+
+class X : int
+{
+}
index 4a3c42f35f2d7beb7abd3934d3b1fe4067a04246..88bde9ba9be10f8fc012d9345da99c124877243e 100644 (file)
@@ -4871,7 +4871,10 @@ namespace Mono.CSharp {
                                        if (initializer == null)
                                                return null;
 
-                                       initializer = Convert.ImplicitConversionRequired (bc, initializer, TypeManager.idisposable_type, loc);
+                                       // Once there is dynamic used defer conversion to runtime even if we know it will never succeed
+                                       Arguments args = new Arguments (1);
+                                       args.Add (new Argument (initializer));
+                                       initializer = new DynamicConversion (TypeManager.idisposable_type, 0, args, initializer.Location).Resolve (bc);
                                        if (initializer == null)
                                                return null;
 
index 16e6564d5c7c2eec8f7c68e2cf01354013fdf026..99b8919ef35cf9b80dce99873fa3e795334da6e1 100644 (file)
@@ -422,6 +422,9 @@ namespace Mono.CSharp
                public PredefinedTypeSpec (MemberKind kind, string ns, string name)
                        : base (kind, null, null, null, Modifiers.PUBLIC)
                {
+                       if (kind == MemberKind.Struct)
+                               modifiers |= Modifiers.SEALED;
+
                        this.name = name;
                        this.ns = ns;
                }
index d4999c0fc6e40ba7a78e723ad1c29caae5455b0e..291ad05aad1b0aa37ac1429c31e8dadd15691550 100644 (file)
@@ -17,6 +17,14 @@ class Helper
 class Tester
 {
 #pragma warning disable 169
+       void Using_1 ()
+       {
+               AssertError (
+                       () => {
+                               using (dynamic d = 1) { }
+                       }, "Cannot implicitly convert type `int' to `System.IDisposable'");
+       }
+       
        void Unsafe_1 ()
        {
                dynamic d = 1;
diff --git a/mcs/tests/test-577.cs b/mcs/tests/test-577.cs
new file mode 100644 (file)
index 0000000..b55573a
--- /dev/null
@@ -0,0 +1,16 @@
+using System;
+
+interface IA
+{
+       event EventHandler e_a, e_b;
+}
+
+class C : IA
+{
+       event EventHandler IA.e_a { add {} remove {} }
+       event EventHandler IA.e_b { add {} remove {} }
+       
+       public static void Main ()
+       {
+       }
+}
\ No newline at end of file
index d50dc82ffe540cc020a93f5f3388f888935159e7..fa5216c11fedfc3f05bf23ff9795217c09cf0066 100644 (file)
         <size>404</size>
       </method>
       <method name="Boolean UsingTest()">
-        <size>453</size>
+        <size>585</size>
       </method>
       <method name="Int32 Main()">
         <size>71</size>
       </method>
     </type>
     <type name="Tester+&lt;Unsafe_1&gt;c__AnonStorey0">
-      <method name="Void &lt;&gt;m__0()">
-        <size>110</size>
-      </method>
       <method name="Void .ctor()">
         <size>7</size>
       </method>
       <method name="Void NullableConversion()">
         <size>47</size>
       </method>
-      <method name="Void &lt;NullableConversion&gt;m__1()">
+      <method name="Void Using_1()">
+        <size>40</size>
+      </method>
+      <method name="Void &lt;Using_1&gt;m__0()">
+        <size>89</size>
+      </method>
+      <method name="Void &lt;NullableConversion&gt;m__2()">
         <size>105</size>
       </method>
-      <method name="Boolean &lt;Main&gt;m__2(System.Reflection.MethodInfo)">
+      <method name="Boolean &lt;Main&gt;m__3(System.Reflection.MethodInfo)">
         <size>12</size>
       </method>
-      <method name="System.String &lt;Main&gt;m__3(System.Reflection.MethodInfo)">
+      <method name="System.String &lt;Main&gt;m__4(System.Reflection.MethodInfo)">
         <size>7</size>
       </method>
-      <method name="Boolean &lt;Main&gt;m__4(System.Reflection.MethodInfo)">
+      <method name="Boolean &lt;Main&gt;m__5(System.Reflection.MethodInfo)">
         <size>7</size>
       </method>
-      <method name="Boolean &lt;Main&gt;m__5(Boolean)">
+      <method name="Boolean &lt;Main&gt;m__6(Boolean)">
         <size>5</size>
       </method>
     </type>
+    <type name="Tester+&lt;Unsafe_1&gt;c__AnonStorey0">
+      <method name="Void &lt;&gt;m__1()">
+        <size>110</size>
+      </method>
+    </type>
   </test>
   <test name="dtest-etree-01.cs">
     <type name="C">
   </test>
   <test name="test-695.cs">
     <type name="Program">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-      <method name="Void .cctor()">
-        <size>53</size>
-      </method>
       <method name="Int32 Main()">
         <size>680</size>
       </method>
       <method name="System.String get_BaseDirectory()">
         <size>28</size>
       </method>
+      <method name="Void .ctor()">
+        <size>7</size>
+      </method>
+      <method name="Void .cctor()">
+        <size>53</size>
+      </method>
     </type>
     <type name="&lt;PrivateImplementationDetails&gt;">
       <method name="Void .ctor()">