[mcs] Emit valid code for exception filter using constrained type parameter
authorMarek Safar <marek.safar@gmail.com>
Tue, 1 Jul 2014 10:45:28 +0000 (12:45 +0200)
committerMarek Safar <marek.safar@gmail.com>
Tue, 1 Jul 2014 10:45:28 +0000 (12:45 +0200)
mcs/mcs/statement.cs
mcs/tests/test-ex-filter-06.cs [new file with mode: 0644]
mcs/tests/ver-il-net_4_5.xml

index e015b143da8ddaf5640997fce03aa048e58db3be..07ab2da361ccab2d5504e9942debe3e617967637 100644 (file)
@@ -6384,6 +6384,9 @@ namespace Mono.CSharp {
                                                ctch.hoisted_temp.Emit (ec);
                                        else
                                                ctch.li.Emit (ec);
+
+                                       if (!ctch.IsGeneral && ctch.type.Kind == MemberKind.TypeParameter)
+                                               ec.Emit (OpCodes.Box, ctch.type);
                                }
 
                                var expr_start = ec.DefineLabel ();
diff --git a/mcs/tests/test-ex-filter-06.cs b/mcs/tests/test-ex-filter-06.cs
new file mode 100644 (file)
index 0000000..86bbf0e
--- /dev/null
@@ -0,0 +1,29 @@
+using System;
+using System.IO;
+using System.Collections.Generic;
+
+class C
+{
+       static int Test<T> () where T : Exception
+       {
+               try {
+                       throw null;
+               } catch (T t) if (t.Message != null) {
+                       return 0;
+               }
+       }
+       static int Main()
+       {
+               try {
+                       Test<ApplicationException> ();
+                       return 1;
+               } catch {
+               }
+
+               if (Test<NullReferenceException> () != 0)
+                       return 2;
+
+               return 0;
+       }
+}
\ No newline at end of file
index 1cee9318daf5871156cfda21f95f8a051dc8b53b..2eb7696b19102a8e38ce8d162ff96b6c3467c8a2 100644 (file)
       </method>\r
     </type>\r
   </test>\r
+  <test name="test-ex-filter-06.cs">\r
+    <type name="C">\r
+      <method name="Int32 Test[T]()" attrs="145">\r
+        <size>61</size>\r
+      </method>\r
+      <method name="Int32 Main()" attrs="145">\r
+        <size>49</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+  </test>\r
   <test name="test-externalias-01.cs">\r
     <type name="Test">\r
       <method name="Int32 Main()" attrs="150">\r