From c710f86dcb7b0f1a75b5790d375abf12de2a830c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=BE=D0=BD=D0=B4=D0=B0=D1=80=D0=B5=D0=B2=20=D0=98?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD?= Date: Sun, 2 Jul 2017 10:44:59 +0200 Subject: [PATCH] bug fix #433 --- Optimizer/Optimizer.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Optimizer/Optimizer.cs b/Optimizer/Optimizer.cs index 1f9fef11c..19edbd949 100644 --- a/Optimizer/Optimizer.cs +++ b/Optimizer/Optimizer.cs @@ -17,6 +17,7 @@ namespace PascalABCCompiler private common_type_node current_type; private bool condition_block = false; private bool has_returns = false; + private bool has_goto = false; public Optimizer() { @@ -135,6 +136,7 @@ namespace PascalABCCompiler VisitNestedFunction(nested); current_function = cmn; has_returns = false; + has_goto = false; VisitStatement(cmn.function_code); foreach (var_definition_node vdn2 in cmn.var_definition_nodes_list) { @@ -253,6 +255,7 @@ namespace PascalABCCompiler VisitNestedFunction(nested); current_function = cnfn; has_returns = false; + has_goto = false; VisitStatement(cnfn.function_code); foreach (var_definition_node vdn2 in cnfn.var_definition_nodes_list) { @@ -322,6 +325,7 @@ namespace PascalABCCompiler VisitNestedFunction(nested); current_function = cnfn; has_returns = false; + has_goto = false; VisitStatement(cnfn.function_code); foreach (var_definition_node vdn2 in cnfn.var_definition_nodes_list) { @@ -380,7 +384,7 @@ namespace PascalABCCompiler private void VisitStatement(statement_node sn) { if (sn == null) return; - if (!(sn is statements_list) && is_break_stmt) + if (!(sn is statements_list) && is_break_stmt && !has_goto) { warns.Add(new UnreachableCodeDetected(sn.location)); is_break_stmt = false; @@ -548,12 +552,12 @@ namespace PascalABCCompiler } for (int i = 0; i < stmt.statements.Count; i++) { - if (is_break_stmt && stmt.statements[i].semantic_node_type != semantic_node_type.empty_statement) + if (is_break_stmt && !has_goto && stmt.statements[i].semantic_node_type != semantic_node_type.empty_statement) warns.Add(new UnreachableCodeDetected(stmt.statements[i].location)); is_break_stmt = false; sn = stmt.statements[i]; VisitStatement(sn); - if (is_break_stmt && i < stmt.statements.Count - 1 && stmt.statements[i + 1].semantic_node_type != semantic_node_type.empty_statement) + if (is_break_stmt && !has_goto && i < stmt.statements.Count - 1 && stmt.statements[i + 1].semantic_node_type != semantic_node_type.empty_statement) warns.Add(new UnreachableCodeDetected(stmt.statements[i + 1].location)); is_break_stmt = false; } @@ -631,6 +635,7 @@ namespace PascalABCCompiler private void VisitGoto(goto_statement stmt) { + has_goto = true; } private void IncreaseNumUseVar(var_definition_node lvr)