Fix async statements with unused return value. Fixes #5602
authorMarek Safar <marek.safar@gmail.com>
Mon, 11 Jun 2012 11:06:24 +0000 (12:06 +0100)
committerMarek Safar <marek.safar@gmail.com>
Mon, 11 Jun 2012 11:11:35 +0000 (12:11 +0100)
mcs/mcs/async.cs
mcs/tests/test-async-36.cs [new file with mode: 0644]
mcs/tests/ver-il-net_4_5.xml

index c2885de8e0b1350a76c2a137ffa70c73b0831d1a..67f11eb90de5a6288337a8e2a58f134f23eb6d7c 100644 (file)
@@ -278,14 +278,8 @@ namespace Mono.CSharp
 
                        awaiter.IsAvailableForReuse = true;
 
-                       if (ResultType.Kind != MemberKind.Void) {
-                               var storey = (AsyncTaskStorey) machine_initializer.Storey;
-
-                           if (storey.HoistedReturn != null)
-                               storey.HoistedReturn.EmitAssign (ec);
-                               else
-                                       ec.Emit (OpCodes.Pop);
-                       }
+                       if (ResultType.Kind != MemberKind.Void)
+                               ec.Emit (OpCodes.Pop);
                }
 
                void Error_WrongAwaiterPattern (ResolveContext rc, TypeSpec awaiter)
diff --git a/mcs/tests/test-async-36.cs b/mcs/tests/test-async-36.cs
new file mode 100644 (file)
index 0000000..151195b
--- /dev/null
@@ -0,0 +1,25 @@
+using System;
+using System.Threading.Tasks;
+
+class X
+{
+       internal Task<int> ExecuteInternalAsync ()
+       {
+               return Task.FromResult (1);
+       }
+
+       public async Task<object> ExecuteReaderAsync ()
+       {
+               await ExecuteInternalAsync ();
+               return Task.FromResult (0);
+       }
+
+       public static int Main ()
+       {
+               var at = new X ().ExecuteReaderAsync ();
+               if (!at.Wait (1000))
+                       return 1;
+
+               return 0;
+       }
+}
index 2702b606d61fbe113724b844d1428bfccc85908b..72e48eb5e6c9807fcd318b55579200521f0af2b4 100644 (file)
       </method>\r
     </type>\r
   </test>\r
+  <test name="test-async-36.cs">\r
+    <type name="X">\r
+      <method name="System.Threading.Tasks.Task`1[System.Int32] ExecuteInternalAsync()" attrs="131">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="System.Threading.Tasks.Task`1[System.Object] ExecuteReaderAsync()" attrs="134">\r
+        <size>41</size>\r
+      </method>\r
+      <method name="Int32 Main()" attrs="150">\r
+        <size>44</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+    <type name="X+&lt;ExecuteReaderAsync&gt;c__async0">\r
+      <method name="Void MoveNext()" attrs="486">\r
+        <size>176</size>\r
+      </method>\r
+      <method name="Void SetStateMachine(IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
+      </method>\r
+    </type>\r
+  </test>\r
   <test name="test-cls-00.cs">\r
     <type name="CLSCLass_6">\r
       <method name="Void add_Disposed(Delegate)" attrs="2182">\r