diff --git a/Optimizer/Optimizer.cs b/Optimizer/Optimizer.cs index 2b3a27a3f..be11fccb6 100644 --- a/Optimizer/Optimizer.cs +++ b/Optimizer/Optimizer.cs @@ -588,16 +588,30 @@ namespace PascalABCCompiler if (!(i < stmt.statements.Count - 1 && stmt.statements[i + 1].semantic_node_type == semantic_node_type.empty_statement)) is_break_stmt = false; } - if (!tuple_decomp) - foreach (local_block_variable vdn in stmt.local_variables) + int tuples_num = 0; + foreach (local_block_variable vdn in stmt.local_variables) + { + if (vdn.name.StartsWith("#fpl") || vdn.name.StartsWith("#temp_var")) { - VarInfo vi = helper.GetVariable(vdn); - if (isUnused(vi, vdn)) - warns.Add(new UnusedVariable(vdn.name, vdn.loc)); - - if (vi.num_ass > 0 && vi.act_num_use == 0 && !vdn.is_special_name) - AddWarningAssignWithoutUsing(vdn.name, vi.last_ass_loc); + tuple_decomp = true; + if (vdn.type is generic_instance_type_node) + tuples_num = (vdn.type as generic_instance_type_node).generic_params.Count; + else if (vdn.type is compiled_type_node) + tuples_num = (vdn.type as compiled_type_node).compiled_type.GetGenericArguments().Length; + continue; } + else if (tuples_num > 0) + { + tuples_num--; + continue; + } + VarInfo vi = helper.GetVariable(vdn); + if (isUnused(vi, vdn)) + warns.Add(new UnusedVariable(vdn.name, vdn.loc)); + + if (vi.num_ass > 0 && vi.act_num_use == 0 && !vdn.is_special_name) + AddWarningAssignWithoutUsing(vdn.name, vi.last_ass_loc); + } } private void VisitExternalStatementNode(external_statement sn)