[mcs] Add missing vector cloning of definite assignment on-true. Fixes #57505
authorMarek Safar <marek.safar@gmail.com>
Wed, 21 Jun 2017 10:52:20 +0000 (12:52 +0200)
committerMarek Safar <marek.safar@gmail.com>
Wed, 21 Jun 2017 13:13:31 +0000 (15:13 +0200)
mcs/errors/cs0165-57.cs [new file with mode: 0644]
mcs/errors/cs0165-58.cs [new file with mode: 0644]
mcs/mcs/statement.cs

diff --git a/mcs/errors/cs0165-57.cs b/mcs/errors/cs0165-57.cs
new file mode 100644 (file)
index 0000000..61bb2c6
--- /dev/null
@@ -0,0 +1,54 @@
+// CS0165: Use of unassigned local variable `v'
+// Line: 52
+
+struct Vector3
+{
+       int field1, field2, field3;
+}
+
+public class C
+{
+       void Update ()
+       {
+               int v1 = 0;
+               int v2 = 0;
+               int v3 = 0;
+               int v4 = 0;
+               int v5 = 0;
+               int v6 = 0;
+               int v7 = 0;
+               int v8 = 0;
+               int v9 = 0;
+               int v10 = 0;
+               int v11 = 0;
+               int v12 = 0;
+               int v13 = 0;
+               int v14 = 0;
+               int v15 = 0;
+               int v16 = 0;
+               int v17 = 0;
+               int v18 = 0;
+               int v19 = 0;
+               int v20 = 0;
+               int v21 = 0;
+               int v22 = 0;
+               int v23 = 0;
+               int v24 = 0;
+               int v25 = 0;
+               int v26 = 0;
+               int v27 = 0;        
+               int v29;
+
+               Vector3 v;
+               if (v1 == 0)
+               {
+                       v = new Vector3 ();
+               }
+               else if (v2 >= 0.5)
+               {
+                       v = new Vector3 ();
+               }
+
+               System.GC.KeepAlive (v);
+       }
+}
\ No newline at end of file
diff --git a/mcs/errors/cs0165-58.cs b/mcs/errors/cs0165-58.cs
new file mode 100644 (file)
index 0000000..71b1cc4
--- /dev/null
@@ -0,0 +1,49 @@
+// CS0165: Use of unassigned local variable `v'
+// Line: 52
+
+struct Vector3
+{
+       int field1, field2, field3;
+}
+
+public class C
+{
+       void Update ()
+       {
+               int v1 = 0;
+               int v2 = 0;
+               int v3 = 0;
+               int v4 = 0;
+               int v5 = 0;
+               int v6 = 0;
+               int v7 = 0;
+               int v8 = 0;
+               int v9 = 0;
+               int v10 = 0;
+               int v11 = 0;
+               int v12 = 0;
+               int v13 = 0;
+               int v14 = 0;
+               int v15 = 0;
+               int v16 = 0;
+               int v17 = 0;
+               int v18 = 0;
+               int v19 = 0;
+               int v20 = 0;
+               int v21 = 0;
+               int v22 = 0;
+               int v23 = 0;
+               int v24 = 0;
+               int v25 = 0;
+               int v26 = 0;
+               int v27 = 0;        
+               int v29;
+
+               Vector3 v;
+               while (v8 != 0) {
+                       v = new Vector3 ();
+               }
+
+               System.GC.KeepAlive (v);
+       }
+}
\ No newline at end of file
index dd7f737139ea372f64af929377608936fd582120..7a379fc172aff0bd375aefb7cdbee386f7e4f0c4 100644 (file)
@@ -269,7 +269,7 @@ namespace Mono.CSharp {
 
                        var da_false = new DefiniteAssignmentBitSet (fc.DefiniteAssignmentOnFalse);
 
-                       fc.DefiniteAssignment = fc.DefiniteAssignmentOnTrue;
+                       fc.BranchDefiniteAssignment (fc.DefiniteAssignmentOnTrue);
                        var labels = fc.CopyLabelStack ();
 
                        var res = TrueStatement.FlowAnalysis (fc);
@@ -578,9 +578,10 @@ namespace Mono.CSharp {
                {
                        expr.FlowAnalysisConditional (fc);
 
-                       fc.DefiniteAssignment = fc.DefiniteAssignmentOnTrue;
                        var da_false = new DefiniteAssignmentBitSet (fc.DefiniteAssignmentOnFalse);
 
+                       fc.BranchDefiniteAssignment (fc.DefiniteAssignmentOnTrue);
+
                        Statement.FlowAnalysis (fc);
 
                        //