[mcs] Adds handling for declared variables from while loop condition
authorMarek Safar <marek.safar@gmail.com>
Fri, 4 Aug 2017 21:48:16 +0000 (23:48 +0200)
committerMarek Safar <marek.safar@gmail.com>
Fri, 4 Aug 2017 21:49:42 +0000 (23:49 +0200)
mcs/mcs/argument.cs
mcs/mcs/ecore.cs
mcs/mcs/expression.cs
mcs/tests/test-decl-expr-05.cs [new file with mode: 0644]
mcs/tests/ver-il-net_4_x.xml

index 702ace629c3f3e4fb23802345b31a97428eca232..00fd56d8a64a23743451fc6b829f07abe77f3cec 100644 (file)
@@ -473,6 +473,13 @@ namespace Mono.CSharp
                        Emit (ec, false, false);
                }
 
+               public void EmitPrepare (EmitContext ec)
+               {
+                       foreach (var a in args) {
+                               a.Expr.EmitPrepare (ec);
+                       }
+               }
+
                //
                // if `dup_args' is true or any of arguments contains await.
                // A copy of all arguments will be returned to the caller
index 7704e72b168738451687821fde3c4ddd8b26a7d9..9486475305452e2ab5c326d264e3f0954e58a661 100644 (file)
@@ -4059,6 +4059,11 @@ namespace Mono.CSharp {
                        throw new NotSupportedException ();
                }
 
+               public override void EmitPrepare (EmitContext ec)
+               {
+                       InstanceExpression?.EmitPrepare (ec);
+               }
+
                public void EmitCall (EmitContext ec, Arguments arguments, bool statement)
                {
                        var call = new CallEmitter ();
index 896980968d82efd168067c2664980380ecbe842c..113ed29910c155493a769098bc9e058a05712a96 100644 (file)
@@ -2616,7 +2616,8 @@ namespace Mono.CSharp
 
                public void AddressOf (EmitContext ec, AddressOp mode)
                {
-                       Variable.CreateBuilder (ec);
+                       if (!Variable.Created)
+                               Variable.CreateBuilder (ec);
 
                        if (Initializer != null) {
                                lvr.EmitAssign (ec, Initializer, false, false);
@@ -2689,6 +2690,11 @@ namespace Mono.CSharp
                {
                        throw new NotImplementedException ();
                }
+
+               public override void EmitPrepare (EmitContext ec)
+               {
+                       Variable.CreateBuilder (ec);
+               }
        }
        
        //
@@ -7387,7 +7393,14 @@ namespace Mono.CSharp
                        else
                                mg.EmitCall (ec, arguments, false);
                }
-               
+
+               public override void EmitPrepare (EmitContext ec)
+               {
+                       mg.EmitPrepare (ec);
+
+                       arguments?.EmitPrepare (ec);
+               }
+
                public override void EmitStatement (EmitContext ec)
                {
                        if (mg.IsConditionallyExcluded)
diff --git a/mcs/tests/test-decl-expr-05.cs b/mcs/tests/test-decl-expr-05.cs
new file mode 100644 (file)
index 0000000..730fd42
--- /dev/null
@@ -0,0 +1,21 @@
+class X
+{
+       void Test (string arg)
+       {
+               while (Call (out string s))
+               {
+                       arg = s.ToString ();
+               }
+       }
+
+       static bool Call (out string s)
+       {
+               s = "";
+               return true;
+       }
+
+       public static void Main ()
+       {
+               Call (out string s);
+       }
+}
\ No newline at end of file
index eae0f275f16d50e0c382d004bd08313a90350adb..d3c5c4ff729670f377698b2044e242d2abcefb1c 100644 (file)
       </method>
     </type>
   </test>
+  <test name="test-decl-expr-05.cs">
+    <type name="X">
+      <method name="Void Test(System.String)" attrs="129">
+        <size>29</size>
+      </method>
+      <method name="Boolean Call(System.String ByRef)" attrs="145">
+        <size>17</size>
+      </method>
+      <method name="Void Main()" attrs="150">
+        <size>10</size>
+      </method>
+      <method name="Void .ctor()" attrs="6278">
+        <size>7</size>
+      </method>
+    </type>
+  </test>
   <test name="test-dictinit-01.cs">
     <type name="Program">
       <method name="Int32 Main()" attrs="145">