From 21192c842474c0f45f943bbfdfaa7cfa8fa8a4f1 Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Wed, 21 Jun 2017 12:52:20 +0200 Subject: [PATCH] [mcs] Add missing vector cloning of definite assignment on-true. Fixes #57505 --- mcs/errors/cs0165-57.cs | 54 +++++++++++++++++++++++++++++++++++++++++++++++++ mcs/errors/cs0165-58.cs | 49 ++++++++++++++++++++++++++++++++++++++++++++ mcs/mcs/statement.cs | 5 +++-- 3 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 mcs/errors/cs0165-57.cs create mode 100644 mcs/errors/cs0165-58.cs diff --git a/mcs/errors/cs0165-57.cs b/mcs/errors/cs0165-57.cs new file mode 100644 index 00000000000..61bb2c6b502 --- /dev/null +++ b/mcs/errors/cs0165-57.cs @@ -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 index 00000000000..71b1cc4f01d --- /dev/null +++ b/mcs/errors/cs0165-58.cs @@ -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 diff --git a/mcs/mcs/statement.cs b/mcs/mcs/statement.cs index dd7f737139e..7a379fc172a 100644 --- a/mcs/mcs/statement.cs +++ b/mcs/mcs/statement.cs @@ -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); // -- 2.11.4.GIT