[runtime] Don't insta-fail when a faulty COM type is encountered. (#5616)
[mono.git] / mono / tests / bug-8477.cs
diff --git a/mono/tests/bug-8477.cs b/mono/tests/bug-8477.cs
new file mode 100644 (file)
index 0000000..b806a6e
--- /dev/null
@@ -0,0 +1,42 @@
+// This test is meant to make sure Mono doesn't fail when invalid COM invocations are present but never reached.
+// See https://bugzilla.xamarin.com/show_bug.cgi?id=8477 for details.
+
+using System;
+using System.Runtime.InteropServices;
+using System.Runtime.CompilerServices;
+
+[ComImport, Guid("06A82D35-8946-4E2E-AE71-DADDE8341F5D")]
+class COMponent
+{
+    [MethodImpl(MethodImplOptions.InternalCall)] public static extern void InCOMplete1 ();
+    [MethodImpl(MethodImplOptions.InternalCall)] public extern void InCOMplete2 ();
+}
+
+class Test
+{
+    static void COMmunicate (COMponent c)
+    {
+       if (c != null)
+           c.InCOMplete2 ();
+    }
+
+    static int Main()
+    {
+       // Check #1: An invocation of a ComImport class method w/o a corresponding interface method must lead to an exception.
+       try
+       {
+           COMponent.InCOMplete1();
+           // No exception has been thrown, something is wrong.
+           return 1;
+       }
+       catch (InvalidOperationException)
+       {
+           // An exception has been thrown and caught correctly.
+       }
+
+       // Check #2: Same as #1, but the method is not executed (i.e. it's located in a "cold" basic block). No exception should be thrown.
+       COMmunicate (null);
+
+       return 0;
+    }
+}