[mcs] Null conditional operator is never suppose to work with await according to...
authorMarek Safar <marek.safar@gmail.com>
Mon, 7 Mar 2016 20:00:08 +0000 (21:00 +0100)
committerMarek Safar <marek.safar@gmail.com>
Mon, 7 Mar 2016 20:02:55 +0000 (21:02 +0100)
mcs/mcs/async.cs
mcs/tests/test-async-83.cs [new file with mode: 0644]
mcs/tests/ver-il-net_4_x.xml

index 22e4c1b4b8c3efd233b937c9de66f7ad722b6ca8..b3efae3241024e39237558fbf7b0634d32f8a761 100644 (file)
@@ -349,7 +349,11 @@ namespace Mono.CSharp
 
                        var errors_printer = new SessionReportPrinter ();
                        var old = bc.Report.SetPrinter (errors_printer);
-                       ama = new Invocation (ama, args).Resolve (bc);
+
+                       //
+                       // The expression await t is classified the same way as the expression (t).GetAwaiter().GetResult(). 
+                       //
+                       ama = new Invocation (new ParenthesizedExpression (ama, Location.Null), args).Resolve (bc);
                        bc.Report.SetPrinter (old);
 
                        if (errors_printer.ErrorsCount > 0 || !MemberAccess.IsValidDotExpression (ama.Type)) {
diff --git a/mcs/tests/test-async-83.cs b/mcs/tests/test-async-83.cs
new file mode 100644 (file)
index 0000000..b12dd20
--- /dev/null
@@ -0,0 +1,34 @@
+using System;
+using System.Threading.Tasks;
+
+class MainClass
+{
+       public static int Main ()
+       {
+               var t = GetSomeStrings (null);
+               try {
+                       var s = t.Result;
+                       return 1;
+               } catch (AggregateException e) {
+                       if (e.InnerException is NullReferenceException)
+                               return 0;
+
+                       return 2;
+               }
+       }
+
+       public static async Task<string> GetSomeStrings (AsyncStringFactory myFactory)
+       {
+               var res = await myFactory?.GetSomeStringAsync ();
+               return res;
+       }
+}
+
+public class AsyncStringFactory
+{
+       public async Task<string> GetSomeStringAsync ()
+       {
+               await Task.Yield();
+               return "foo";
+       }
+}
\ No newline at end of file
index 702908fa939bc229550ee0ca428253144160d534..b3846fd0d9765258b282f4fe5939a99bc6c91f13 100644 (file)
       </method>
     </type>
   </test>
-  <test name="test-async-19.cs">
-    <type name="C">
-      <method name="Void Test(System.Threading.ManualResetEvent)" attrs="145">
-        <size>35</size>
-      </method>
-      <method name="Int32 Main()" attrs="150">
-        <size>96</size>
-      </method>
-      <method name="Void CurrentDomain_UnhandledException(System.Object, System.UnhandledExceptionEventArgs)" attrs="145">
-        <size>29</size>
-      </method>
-      <method name="Void .ctor()" attrs="6278">
-        <size>7</size>
-      </method>
-      <method name="Void .cctor()" attrs="6289">
-        <size>12</size>
-      </method>
-    </type>
-    <type name="C+&lt;Test&gt;c__async0">
-      <method name="Void MoveNext()" attrs="486">
-        <size>227</size>
-      </method>
-    </type>
-    <type name="C+&lt;Test&gt;c__async0+&lt;Test&gt;c__AnonStorey1">
-      <method name="Void &lt;&gt;m__0()" attrs="131">
-        <size>29</size>
-      </method>
-      <method name="Void .ctor()" attrs="6278">
-        <size>7</size>
-      </method>
-    </type>
-    <type name="C+&lt;Test&gt;c__async0">
-      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">
-        <size>13</size>
-      </method>
-    </type>
-  </test>
   <test name="test-async-20.cs">
     <type name="Base">
       <method name="Void .ctor()" attrs="6278">
       </method>
     </type>
   </test>
+  <test name="test-async-83.cs">
+    <type name="MainClass">
+      <method name="Int32 Main()" attrs="150">
+        <size>57</size>
+      </method>
+      <method name="System.Threading.Tasks.Task`1[System.String] GetSomeStrings(AsyncStringFactory)" attrs="150">
+        <size>41</size>
+      </method>
+      <method name="Void .ctor()" attrs="6278">
+        <size>7</size>
+      </method>
+    </type>
+    <type name="AsyncStringFactory">
+      <method name="System.Threading.Tasks.Task`1[System.String] GetSomeStringAsync()" attrs="134">
+        <size>33</size>
+      </method>
+      <method name="Void .ctor()" attrs="6278">
+        <size>7</size>
+      </method>
+    </type>
+    <type name="MainClass+&lt;GetSomeStrings&gt;c__async0">
+      <method name="Void MoveNext()" attrs="486">
+        <size>191</size>
+      </method>
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">
+        <size>13</size>
+      </method>
+    </type>
+    <type name="AsyncStringFactory+&lt;GetSomeStringAsync&gt;c__async0">
+      <method name="Void MoveNext()" attrs="486">
+        <size>171</size>
+      </method>
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">
+        <size>13</size>
+      </method>
+    </type>
+  </test>
   <test name="test-cls-00.cs">
     <type name="CLSCLass_6">
       <method name="Void add_Disposed(Delegate)" attrs="2182">