[vala] Enable flow analysis for out parameters



commit 43570fcee9d6965690b9c612b7c886cb85ad107f
Author: Luca Bruno <lucabru src gnome org>
Date:   Wed Jun 1 10:18:44 2011 +0200

    Enable flow analysis for out parameters
    
    Fixes bug 638363.

 vala/valaassignment.vala                  |    7 ++-
 vala/valabinaryexpression.vala            |    4 +-
 vala/valacastexpression.vala              |    4 +-
 vala/valacatchclause.vala                 |    2 +-
 vala/valacodenode.vala                    |    4 +-
 vala/valadeclarationstatement.vala        |    4 +-
 vala/valaelementaccess.vala               |    4 +-
 vala/valaexpressionstatement.vala         |    4 +-
 vala/valaflowanalyzer.vala                |  112 ++++++++++++++++++-----------
 vala/valaforeachstatement.vala            |    2 +-
 vala/valalambdaexpression.vala            |    4 +-
 vala/valamemberaccess.vala                |    7 ++-
 vala/valamethod.vala                      |    4 +-
 vala/valamethodcall.vala                  |    4 +-
 vala/valanamedargument.vala               |    4 +-
 vala/valaobjectcreationexpression.vala    |    4 +-
 vala/valaphifunction.vala                 |   10 ++--
 vala/valapointerindirection.vala          |    4 +-
 vala/valapostfixexpression.vala           |    7 ++-
 vala/valareferencetransferexpression.vala |    4 +-
 vala/valareturnstatement.vala             |    4 +-
 vala/valasliceexpression.vala             |    4 +-
 vala/valathrowstatement.vala              |    4 +-
 vala/valaunaryexpression.vala             |    8 ++-
 24 files changed, 129 insertions(+), 90 deletions(-)
---
diff --git a/vala/valaassignment.vala b/vala/valaassignment.vala
index 3b8857a..d88c3e0 100644
--- a/vala/valaassignment.vala
+++ b/vala/valaassignment.vala
@@ -536,16 +536,19 @@ public class Vala.Assignment : Expression {
 		codegen.visit_expression (this);
 	}
 
-	public override void get_defined_variables (Collection<LocalVariable> collection) {
+	public override void get_defined_variables (Collection<Variable> collection) {
 		right.get_defined_variables (collection);
 		left.get_defined_variables (collection);
 		var local = left.symbol_reference as LocalVariable;
+		var param = left.symbol_reference as Parameter;
 		if (local != null) {
 			collection.add (local);
+		} else if (param != null && param.direction == ParameterDirection.OUT) {
+			collection.add (param);
 		}
 	}
 
-	public override void get_used_variables (Collection<LocalVariable> collection) {
+	public override void get_used_variables (Collection<Variable> collection) {
 		var ma = left as MemberAccess;
 		var ea = left as ElementAccess;
 		if (ma != null && ma.inner != null) {
diff --git a/vala/valabinaryexpression.vala b/vala/valabinaryexpression.vala
index 50d4948..07b3ee3 100644
--- a/vala/valabinaryexpression.vala
+++ b/vala/valabinaryexpression.vala
@@ -507,12 +507,12 @@ public class Vala.BinaryExpression : Expression {
 		codegen.visit_expression (this);
 	}
 
-	public override void get_defined_variables (Collection<LocalVariable> collection) {
+	public override void get_defined_variables (Collection<Variable> collection) {
 		left.get_defined_variables (collection);
 		right.get_defined_variables (collection);
 	}
 
-	public override void get_used_variables (Collection<LocalVariable> collection) {
+	public override void get_used_variables (Collection<Variable> collection) {
 		left.get_used_variables (collection);
 		right.get_used_variables (collection);
 	}
diff --git a/vala/valacastexpression.vala b/vala/valacastexpression.vala
index ca5f2a1..40ed1ce 100644
--- a/vala/valacastexpression.vala
+++ b/vala/valacastexpression.vala
@@ -165,11 +165,11 @@ public class Vala.CastExpression : Expression {
 		codegen.visit_expression (this);
 	}
 
-	public override void get_defined_variables (Collection<LocalVariable> collection) {
+	public override void get_defined_variables (Collection<Variable> collection) {
 		inner.get_defined_variables (collection);
 	}
 
-	public override void get_used_variables (Collection<LocalVariable> collection) {
+	public override void get_used_variables (Collection<Variable> collection) {
 		inner.get_used_variables (collection);
 	}
 
diff --git a/vala/valacatchclause.vala b/vala/valacatchclause.vala
index 46b4e0f..a65d749 100644
--- a/vala/valacatchclause.vala
+++ b/vala/valacatchclause.vala
@@ -149,7 +149,7 @@ public class Vala.CatchClause : CodeNode {
 		codegen.visit_catch_clause (this);
 	}
 
-	public override void get_defined_variables (Collection<LocalVariable> collection) {
+	public override void get_defined_variables (Collection<Variable> collection) {
 		if (error_variable != null) {
 			collection.add (error_variable);
 		}
diff --git a/vala/valacodenode.vala b/vala/valacodenode.vala
index b1fc30e..b5f637c 100644
--- a/vala/valacodenode.vala
+++ b/vala/valacodenode.vala
@@ -168,10 +168,10 @@ public abstract class Vala.CodeNode {
 		return str.append (" */").str;
 	}
 
-	public virtual void get_defined_variables (Collection<LocalVariable> collection) {
+	public virtual void get_defined_variables (Collection<Variable> collection) {
 	}
 
-	public virtual void get_used_variables (Collection<LocalVariable> collection) {
+	public virtual void get_used_variables (Collection<Variable> collection) {
 	}
 
 	public static string get_temp_name () {
diff --git a/vala/valadeclarationstatement.vala b/vala/valadeclarationstatement.vala
index 9eb8fff..c4c778f 100644
--- a/vala/valadeclarationstatement.vala
+++ b/vala/valadeclarationstatement.vala
@@ -89,7 +89,7 @@ public class Vala.DeclarationStatement : CodeNode, Statement {
 		codegen.visit_declaration_statement (this);
 	}
 
-	public override void get_defined_variables (Collection<LocalVariable> collection) {
+	public override void get_defined_variables (Collection<Variable> collection) {
 		var local = declaration as LocalVariable;
 		if (local != null) {
 			var array_type = local.variable_type as ArrayType;
@@ -102,7 +102,7 @@ public class Vala.DeclarationStatement : CodeNode, Statement {
 		}
 	}
 
-	public override void get_used_variables (Collection<LocalVariable> collection) {
+	public override void get_used_variables (Collection<Variable> collection) {
 		var local = declaration as LocalVariable;
 		if (local != null && local.initializer != null) {
 			local.initializer.get_used_variables (collection);
diff --git a/vala/valaelementaccess.vala b/vala/valaelementaccess.vala
index d8c7699..c81f3b3 100644
--- a/vala/valaelementaccess.vala
+++ b/vala/valaelementaccess.vala
@@ -238,14 +238,14 @@ public class Vala.ElementAccess : Expression {
 		codegen.visit_expression (this);
 	}
 
-	public override void get_defined_variables (Collection<LocalVariable> collection) {
+	public override void get_defined_variables (Collection<Variable> collection) {
 		container.get_defined_variables (collection);
 		foreach (Expression index in indices) {
 			index.get_defined_variables (collection);
 		}
 	}
 
-	public override void get_used_variables (Collection<LocalVariable> collection) {
+	public override void get_used_variables (Collection<Variable> collection) {
 		container.get_used_variables (collection);
 		foreach (Expression index in indices) {
 			index.get_used_variables (collection);
diff --git a/vala/valaexpressionstatement.vala b/vala/valaexpressionstatement.vala
index afca377..6d01a98 100644
--- a/vala/valaexpressionstatement.vala
+++ b/vala/valaexpressionstatement.vala
@@ -91,11 +91,11 @@ public class Vala.ExpressionStatement : CodeNode, Statement {
 		codegen.visit_expression_statement (this);
 	}
 
-	public override void get_defined_variables (Collection<LocalVariable> collection) {
+	public override void get_defined_variables (Collection<Variable> collection) {
 		expression.get_defined_variables (collection);
 	}
 
-	public override void get_used_variables (Collection<LocalVariable> collection) {
+	public override void get_used_variables (Collection<Variable> collection) {
 		expression.get_used_variables (collection);
 	}
 }
diff --git a/vala/valaflowanalyzer.vala b/vala/valaflowanalyzer.vala
index c17b77b..87d6728 100644
--- a/vala/valaflowanalyzer.vala
+++ b/vala/valaflowanalyzer.vala
@@ -90,9 +90,9 @@ public class Vala.FlowAnalyzer : CodeVisitor {
 	private bool unreachable_reported;
 	private List<JumpTarget> jump_stack = new ArrayList<JumpTarget> ();
 
-	Map<Symbol, List<LocalVariable>> var_map;
-	Set<LocalVariable> used_vars;
-	Map<LocalVariable, PhiFunction> phi_functions;
+	Map<Symbol, List<Variable>> var_map;
+	Set<Variable> used_vars;
+	Map<Variable, PhiFunction> phi_functions;
 
 	public FlowAnalyzer () {
 	}
@@ -199,6 +199,16 @@ public class Vala.FlowAnalyzer : CodeVisitor {
 			result_ma.symbol_reference = m.result_var;
 			m.return_block.add_node (result_ma);
 		}
+		if (m is Method) {
+			// ensure out parameters are defined at end of method
+			foreach (var param in ((Method) m).get_parameters ()) {
+				if (param.direction == ParameterDirection.OUT) {
+					var param_ma = new MemberAccess.simple (param.name, param.source_reference);
+					param_ma.symbol_reference = param;
+					m.return_block.add_node (param_ma);
+				}
+			}
+		}
 
 		current_block = new BasicBlock ();
 		m.entry_block.connect (current_block);
@@ -330,19 +340,19 @@ public class Vala.FlowAnalyzer : CodeVisitor {
 		}
 	}
 
-	Map<LocalVariable, Set<BasicBlock>> get_assignment_map (List<BasicBlock> block_list, BasicBlock entry_block) {
-		var map = new HashMap<LocalVariable, Set<BasicBlock>> ();
+	Map<Variable, Set<BasicBlock>> get_assignment_map (List<BasicBlock> block_list, BasicBlock entry_block) {
+		var map = new HashMap<Variable, Set<BasicBlock>> ();
 		foreach (BasicBlock block in block_list) {
-			var defined_variables = new ArrayList<LocalVariable> ();
+			var defined_variables = new ArrayList<Variable> ();
 			foreach (CodeNode node in block.get_nodes ()) {
 				node.get_defined_variables (defined_variables);
 			}
 
-			foreach (LocalVariable local in defined_variables) {
-				var block_set = map.get (local);
+			foreach (Variable variable in defined_variables) {
+				var block_set = map.get (variable);
 				if (block_set == null) {
 					block_set = new HashSet<BasicBlock> ();
-					map.set (local, block_set);
+					map.set (variable, block_set);
 				}
 				block_set.add (block);
 			}
@@ -363,9 +373,9 @@ public class Vala.FlowAnalyzer : CodeVisitor {
 			phi.set (block, 0);
 		}
 
-		foreach (LocalVariable local in assign.get_keys ()) {
+		foreach (Variable variable in assign.get_keys ()) {
 			counter++;
-			foreach (BasicBlock block in assign.get (local)) {
+			foreach (BasicBlock block in assign.get (variable)) {
 				work_list.add (block);
 				added.set (block, counter);
 			}
@@ -375,7 +385,7 @@ public class Vala.FlowAnalyzer : CodeVisitor {
 				foreach (BasicBlock frontier in block.get_dominator_frontier ()) {
 					int blockPhi = phi.get (frontier);
 					if (blockPhi < counter) {
-						frontier.add_phi_function (new PhiFunction (local, frontier.get_predecessors ().size));
+						frontier.add_phi_function (new PhiFunction (variable, frontier.get_predecessors ().size));
 						phi.set (frontier, counter);
 						int block_added = added.get (frontier);
 						if (block_added < counter) {
@@ -389,32 +399,37 @@ public class Vala.FlowAnalyzer : CodeVisitor {
 	}
 
 	void check_variables (BasicBlock entry_block) {
-		var_map = new HashMap<Symbol, List<LocalVariable>>();
-		used_vars = new HashSet<LocalVariable> ();
-		phi_functions = new HashMap<LocalVariable, PhiFunction> ();
+		var_map = new HashMap<Symbol, List<Variable>>();
+		used_vars = new HashSet<Variable> ();
+		phi_functions = new HashMap<Variable, PhiFunction> ();
 
 		check_block_variables (entry_block);
 
 		// check for variables used before initialization
-		var used_vars_queue = new ArrayList<LocalVariable> ();
-		foreach (LocalVariable local in used_vars) {
-			used_vars_queue.add (local);
+		var used_vars_queue = new ArrayList<Variable> ();
+		foreach (Variable variable in used_vars) {
+			used_vars_queue.add (variable);
 		}
 		while (used_vars_queue.size > 0) {
-			LocalVariable used_var = used_vars_queue[0];
+			Variable used_var = used_vars_queue[0];
 			used_vars_queue.remove_at (0);
 
 			PhiFunction phi = phi_functions.get (used_var);
 			if (phi != null) {
-				foreach (LocalVariable local in phi.operands) {
-					if (local == null) {
-						Report.error (used_var.source_reference, "use of possibly unassigned local variable `%s'".printf (used_var.name));
+				foreach (Variable variable in phi.operands) {
+					if (variable == null) {
+						if (used_var is LocalVariable) {
+							Report.error (used_var.source_reference, "use of possibly unassigned local variable `%s'".printf (used_var.name));
+						} else {
+							// parameter
+							Report.warning (used_var.source_reference, "use of possibly unassigned parameter `%s'".printf (used_var.name));
+						}
 						continue;
 					}
-					if (!(local in used_vars)) {
-						local.source_reference = used_var.source_reference;
-						used_vars.add (local);
-						used_vars_queue.add (local);
+					if (!(variable in used_vars)) {
+						variable.source_reference = used_var.source_reference;
+						used_vars.add (variable);
+						used_vars_queue.add (variable);
 					}
 				}
 			}
@@ -423,33 +438,38 @@ public class Vala.FlowAnalyzer : CodeVisitor {
 
 	void check_block_variables (BasicBlock block) {
 		foreach (PhiFunction phi in block.get_phi_functions ()) {
-			LocalVariable versioned_var = process_assignment (var_map, phi.original_variable);
+			Variable versioned_var = process_assignment (var_map, phi.original_variable);
 
 			phi_functions.set (versioned_var, phi);
 		}
 
 		foreach (CodeNode node in block.get_nodes ()) {
-			var used_variables = new ArrayList<LocalVariable> ();
+			var used_variables = new ArrayList<Variable> ();
 			node.get_used_variables (used_variables);
 			
-			foreach (LocalVariable var_symbol in used_variables) {
+			foreach (Variable var_symbol in used_variables) {
 				var variable_stack = var_map.get (var_symbol);
 				if (variable_stack == null || variable_stack.size == 0) {
-					Report.error (node.source_reference, "use of possibly unassigned local variable `%s'".printf (var_symbol.name));
+					if (var_symbol is LocalVariable) {
+						Report.error (node.source_reference, "use of possibly unassigned local variable `%s'".printf (var_symbol.name));
+					} else {
+						// parameter
+						Report.warning (node.source_reference, "use of possibly unassigned parameter `%s'".printf (var_symbol.name));
+					}
 					continue;
 				}
-				var versioned_local = variable_stack.get (variable_stack.size - 1);
-				if (!(versioned_local in used_vars)) {
-					versioned_local.source_reference = node.source_reference;
+				var versioned_variable = variable_stack.get (variable_stack.size - 1);
+				if (!(versioned_variable in used_vars)) {
+					versioned_variable.source_reference = node.source_reference;
 				}
-				used_vars.add (versioned_local);
+				used_vars.add (versioned_variable);
 			}
 
-			var defined_variables = new ArrayList<LocalVariable> ();
+			var defined_variables = new ArrayList<Variable> ();
 			node.get_defined_variables (defined_variables);
 
-			foreach (LocalVariable local in defined_variables) {
-				process_assignment (var_map, local);
+			foreach (Variable variable in defined_variables) {
+				process_assignment (var_map, variable);
 			}
 		}
 
@@ -479,23 +499,29 @@ public class Vala.FlowAnalyzer : CodeVisitor {
 			variable_stack.remove_at (variable_stack.size - 1);
 		}
 		foreach (CodeNode node in block.get_nodes ()) {
-			var defined_variables = new ArrayList<LocalVariable> ();
+			var defined_variables = new ArrayList<Variable> ();
 			node.get_defined_variables (defined_variables);
 
-			foreach (LocalVariable local in defined_variables) {
-				var variable_stack = var_map.get (local);
+			foreach (Variable variable in defined_variables) {
+				var variable_stack = var_map.get (variable);
 				variable_stack.remove_at (variable_stack.size - 1);
 			}
 		}
 	}
 
-	LocalVariable process_assignment (Map<Symbol, List<LocalVariable>> var_map, LocalVariable var_symbol) {
+	Variable process_assignment (Map<Symbol, List<Variable>> var_map, Variable var_symbol) {
 		var variable_stack = var_map.get (var_symbol);
 		if (variable_stack == null) {
-			variable_stack = new ArrayList<LocalVariable> ();
+			variable_stack = new ArrayList<Variable> ();
 			var_map.set (var_symbol, variable_stack);
 		}
-		LocalVariable versioned_var = new LocalVariable (var_symbol.variable_type, var_symbol.name, null, var_symbol.source_reference);
+		Variable versioned_var;
+		if (var_symbol is LocalVariable) {
+			versioned_var = new LocalVariable (var_symbol.variable_type, var_symbol.name, null, var_symbol.source_reference);
+		} else {
+			// parameter
+			versioned_var = new Parameter (var_symbol.name, var_symbol.variable_type, var_symbol.source_reference);
+		}
 		variable_stack.add (versioned_var);
 		return versioned_var;
 	}
diff --git a/vala/valaforeachstatement.vala b/vala/valaforeachstatement.vala
index a518a2b..319968a 100644
--- a/vala/valaforeachstatement.vala
+++ b/vala/valaforeachstatement.vala
@@ -403,7 +403,7 @@ public class Vala.ForeachStatement : Block {
 		codegen.visit_foreach_statement (this);
 	}
 
-	public override void get_defined_variables (Collection<LocalVariable> collection) {
+	public override void get_defined_variables (Collection<Variable> collection) {
 		collection.add (element_variable);
 	}
 }
diff --git a/vala/valalambdaexpression.vala b/vala/valalambdaexpression.vala
index ecfe251..1d791af 100644
--- a/vala/valalambdaexpression.vala
+++ b/vala/valalambdaexpression.vala
@@ -255,10 +255,10 @@ public class Vala.LambdaExpression : Expression {
 		codegen.visit_expression (this);
 	}
 
-	public override void get_used_variables (Collection<LocalVariable> collection) {
+	public override void get_used_variables (Collection<Variable> collection) {
 		// require captured variables to be initialized
 		if (method.closure) {
-			method.get_captured_variables (collection);
+			method.get_captured_variables ((Collection<LocalVariable>) collection);
 		}
 	}
 }
diff --git a/vala/valamemberaccess.vala b/vala/valamemberaccess.vala
index aaa5a17..1ec08da 100644
--- a/vala/valamemberaccess.vala
+++ b/vala/valamemberaccess.vala
@@ -847,19 +847,22 @@ public class Vala.MemberAccess : Expression {
 		codegen.visit_expression (this);
 	}
 
-	public override void get_defined_variables (Collection<LocalVariable> collection) {
+	public override void get_defined_variables (Collection<Variable> collection) {
 		if (inner != null) {
 			inner.get_defined_variables (collection);
 		}
 	}
 
-	public override void get_used_variables (Collection<LocalVariable> collection) {
+	public override void get_used_variables (Collection<Variable> collection) {
 		if (inner != null) {
 			inner.get_used_variables (collection);
 		}
 		var local = symbol_reference as LocalVariable;
+		var param = symbol_reference as Parameter;
 		if (local != null) {
 			collection.add (local);
+		} else if (param != null && param.direction == ParameterDirection.OUT) {
+			collection.add (param);
 		}
 	}
 }
diff --git a/vala/valamethod.vala b/vala/valamethod.vala
index 39b2223..d1215ab 100644
--- a/vala/valamethod.vala
+++ b/vala/valamethod.vala
@@ -1164,11 +1164,11 @@ public class Vala.Method : Subroutine {
 		}
 	}
 
-	public override void get_defined_variables (Collection<LocalVariable> collection) {
+	public override void get_defined_variables (Collection<Variable> collection) {
 		// capturing variables is only supported if they are initialized
 		// therefore assume that captured variables are initialized
 		if (closure) {
-			get_captured_variables (collection);
+			get_captured_variables ((Collection<LocalVariable>) collection);
 		}
 	}
 }
diff --git a/vala/valamethodcall.vala b/vala/valamethodcall.vala
index f794979..c602142 100644
--- a/vala/valamethodcall.vala
+++ b/vala/valamethodcall.vala
@@ -791,7 +791,7 @@ public class Vala.MethodCall : Expression {
 		codegen.visit_expression (this);
 	}
 
-	public override void get_defined_variables (Collection<LocalVariable> collection) {
+	public override void get_defined_variables (Collection<Variable> collection) {
 		call.get_defined_variables (collection);
 
 		foreach (Expression arg in argument_list) {
@@ -799,7 +799,7 @@ public class Vala.MethodCall : Expression {
 		}
 	}
 
-	public override void get_used_variables (Collection<LocalVariable> collection) {
+	public override void get_used_variables (Collection<Variable> collection) {
 		call.get_used_variables (collection);
 
 		foreach (Expression arg in argument_list) {
diff --git a/vala/valanamedargument.vala b/vala/valanamedargument.vala
index c88e8fc..4c3e23b 100644
--- a/vala/valanamedargument.vala
+++ b/vala/valanamedargument.vala
@@ -89,11 +89,11 @@ public class Vala.NamedArgument : Expression {
 		codegen.visit_expression (this);
 	}
 
-	public override void get_defined_variables (Collection<LocalVariable> collection) {
+	public override void get_defined_variables (Collection<Variable> collection) {
 		inner.get_defined_variables (collection);
 	}
 
-	public override void get_used_variables (Collection<LocalVariable> collection) {
+	public override void get_used_variables (Collection<Variable> collection) {
 		inner.get_used_variables (collection);
 	}
 }
diff --git a/vala/valaobjectcreationexpression.vala b/vala/valaobjectcreationexpression.vala
index 82e998b..1152b46 100644
--- a/vala/valaobjectcreationexpression.vala
+++ b/vala/valaobjectcreationexpression.vala
@@ -443,13 +443,13 @@ public class Vala.ObjectCreationExpression : Expression {
 		codegen.visit_expression (this);
 	}
 
-	public override void get_defined_variables (Collection<LocalVariable> collection) {
+	public override void get_defined_variables (Collection<Variable> collection) {
 		foreach (Expression arg in argument_list) {
 			arg.get_defined_variables (collection);
 		}
 	}
 
-	public override void get_used_variables (Collection<LocalVariable> collection) {
+	public override void get_used_variables (Collection<Variable> collection) {
 		foreach (Expression arg in argument_list) {
 			arg.get_used_variables (collection);
 		}
diff --git a/vala/valaphifunction.vala b/vala/valaphifunction.vala
index 081fca0..4118796 100644
--- a/vala/valaphifunction.vala
+++ b/vala/valaphifunction.vala
@@ -22,15 +22,15 @@
 
 
 public class Vala.PhiFunction {
-	public LocalVariable original_variable { get; private set; }
+	public Variable original_variable { get; private set; }
 
-	public List<LocalVariable?> operands { get; private set; }
+	public List<Variable?> operands { get; private set; }
 
-	public PhiFunction (LocalVariable variable, int num_of_ops) {
+	public PhiFunction (Variable variable, int num_of_ops) {
 		this.original_variable = variable;
-		this.operands = new ArrayList<LocalVariable?> ();
+		this.operands = new ArrayList<Variable?> ();
 		for (int i = 0; i < num_of_ops; i++) {
-			this.operands.add ((LocalVariable) null);
+			this.operands.add ((Variable) null);
 		}
 	}
 }
diff --git a/vala/valapointerindirection.vala b/vala/valapointerindirection.vala
index 301ca71..fffbf93 100644
--- a/vala/valapointerindirection.vala
+++ b/vala/valapointerindirection.vala
@@ -109,11 +109,11 @@ public class Vala.PointerIndirection : Expression {
 		codegen.visit_expression (this);
 	}
 
-	public override void get_defined_variables (Collection<LocalVariable> collection) {
+	public override void get_defined_variables (Collection<Variable> collection) {
 		inner.get_defined_variables (collection);
 	}
 
-	public override void get_used_variables (Collection<LocalVariable> collection) {
+	public override void get_used_variables (Collection<Variable> collection) {
 		inner.get_used_variables (collection);
 	}
 }
diff --git a/vala/valapostfixexpression.vala b/vala/valapostfixexpression.vala
index 9ac0113..5f44157 100644
--- a/vala/valapostfixexpression.vala
+++ b/vala/valapostfixexpression.vala
@@ -72,15 +72,18 @@ public class Vala.PostfixExpression : Expression {
 		return false;
 	}
 
-	public override void get_defined_variables (Collection<LocalVariable> collection) {
+	public override void get_defined_variables (Collection<Variable> collection) {
 		inner.get_defined_variables (collection);
 		var local = inner.symbol_reference as LocalVariable;
+		var param = inner.symbol_reference as Parameter;
 		if (local != null) {
 			collection.add (local);
+		} else if (param != null && param.direction == ParameterDirection.OUT) {
+			collection.add (param);
 		}
 	}
 
-	public override void get_used_variables (Collection<LocalVariable> collection) {
+	public override void get_used_variables (Collection<Variable> collection) {
 		inner.get_used_variables (collection);
 	}
 
diff --git a/vala/valareferencetransferexpression.vala b/vala/valareferencetransferexpression.vala
index 2d82ac0..29c522e 100644
--- a/vala/valareferencetransferexpression.vala
+++ b/vala/valareferencetransferexpression.vala
@@ -115,11 +115,11 @@ public class Vala.ReferenceTransferExpression : Expression {
 		codegen.visit_expression (this);
 	}
 
-	public override void get_defined_variables (Collection<LocalVariable> collection) {
+	public override void get_defined_variables (Collection<Variable> collection) {
 		inner.get_defined_variables (collection);
 	}
 
-	public override void get_used_variables (Collection<LocalVariable> collection) {
+	public override void get_used_variables (Collection<Variable> collection) {
 		inner.get_used_variables (collection);
 	}
 }
diff --git a/vala/valareturnstatement.vala b/vala/valareturnstatement.vala
index 39aff82..6a53705 100644
--- a/vala/valareturnstatement.vala
+++ b/vala/valareturnstatement.vala
@@ -158,13 +158,13 @@ public class Vala.ReturnStatement : CodeNode, Statement {
 		codegen.visit_return_statement (this);
 	}
 
-	public override void get_defined_variables (Collection<LocalVariable> collection) {
+	public override void get_defined_variables (Collection<Variable> collection) {
 		if (return_expression != null) {
 			return_expression.get_defined_variables (collection);
 		}
 	}
 
-	public override void get_used_variables (Collection<LocalVariable> collection) {
+	public override void get_used_variables (Collection<Variable> collection) {
 		if (return_expression != null) {
 			return_expression.get_used_variables (collection);
 		}
diff --git a/vala/valasliceexpression.vala b/vala/valasliceexpression.vala
index 4680a1b..7b741a3 100644
--- a/vala/valasliceexpression.vala
+++ b/vala/valasliceexpression.vala
@@ -174,13 +174,13 @@ public class Vala.SliceExpression : Expression {
 		codegen.visit_expression (this);
 	}
 
-	public override void get_defined_variables (Collection<LocalVariable> collection) {
+	public override void get_defined_variables (Collection<Variable> collection) {
 		container.get_defined_variables (collection);
 		start.get_defined_variables (collection);
 		stop.get_defined_variables (collection);
 	}
 
-	public override void get_used_variables (Collection<LocalVariable> collection) {
+	public override void get_used_variables (Collection<Variable> collection) {
 		container.get_used_variables (collection);
 		start.get_used_variables (collection);
 		stop.get_used_variables (collection);
diff --git a/vala/valathrowstatement.vala b/vala/valathrowstatement.vala
index 2667db6..2dbcc3d 100644
--- a/vala/valathrowstatement.vala
+++ b/vala/valathrowstatement.vala
@@ -123,11 +123,11 @@ public class Vala.ThrowStatement : CodeNode, Statement {
 		codegen.visit_throw_statement (this);
 	}
 
-	public override void get_defined_variables (Collection<LocalVariable> collection) {
+	public override void get_defined_variables (Collection<Variable> collection) {
 		error_expression.get_defined_variables (collection);
 	}
 
-	public override void get_used_variables (Collection<LocalVariable> collection) {
+	public override void get_used_variables (Collection<Variable> collection) {
 		error_expression.get_used_variables (collection);
 	}
 }
diff --git a/vala/valaunaryexpression.vala b/vala/valaunaryexpression.vala
index a26c3da..11c3bb4 100644
--- a/vala/valaunaryexpression.vala
+++ b/vala/valaunaryexpression.vala
@@ -253,17 +253,21 @@ public class Vala.UnaryExpression : Expression {
 		codegen.visit_expression (this);
 	}
 
-	public override void get_defined_variables (Collection<LocalVariable> collection) {
+	public override void get_defined_variables (Collection<Variable> collection) {
 		inner.get_defined_variables (collection);
 		if (operator == UnaryOperator.OUT || operator == UnaryOperator.REF) {
 			var local = inner.symbol_reference as LocalVariable;
+			var param = inner.symbol_reference as Parameter;
 			if (local != null) {
 				collection.add (local);
 			}
+			if (param != null && param.direction == ParameterDirection.OUT) {
+				collection.add (param);
+			}
 		}
 	}
 
-	public override void get_used_variables (Collection<LocalVariable> collection) {
+	public override void get_used_variables (Collection<Variable> collection) {
 		if (operator != UnaryOperator.OUT) {
 			inner.get_used_variables (collection);
 		}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]