From: Rico Tzschichholz Date: Thu, 29 Aug 2019 10:26:52 +0000 (+0200) Subject: codegen: Don't append unreachable clean-up section of Block X-Git-Tag: 0.46.0~10 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=refs%2Fkeep-around%2F8f3a0a0b64e0c7fbcc9231c3058247920dd6eeda;p=thirdparty%2Fvala.git codegen: Don't append unreachable clean-up section of Block Found by -Werror=unreachable-code See https://gitlab.gnome.org/GNOME/vala/issues/838 --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 1e2b4b38e..5b8140be0 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -2325,7 +2325,13 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { } } - if (b.parent_symbol is Method) { + bool unreachable_exit_block = false; + if (b.parent_symbol is Subroutine) { + unowned BasicBlock? exit_block = ((Subroutine) b.parent_symbol).exit_block; + unreachable_exit_block = (exit_block == null || exit_block.get_predecessors ().size <= 0); + } + + if (!unreachable_exit_block && b.parent_symbol is Method) { var m = (Method) b.parent_symbol; foreach (Parameter param in m.get_parameters ()) { if (!param.captured && !param.ellipsis && requires_destroy (param.variable_type) && param.direction == ParameterDirection.IN) { @@ -2338,14 +2344,14 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { foreach (var postcondition in m.get_postconditions ()) { create_postcondition_statement (postcondition); } - } else if (b.parent_symbol is PropertyAccessor) { + } else if (!unreachable_exit_block && b.parent_symbol is PropertyAccessor) { var acc = (PropertyAccessor) b.parent_symbol; if (acc.value_parameter != null && !acc.value_parameter.captured && requires_destroy (acc.value_parameter.variable_type)) { ccode.add_expression (destroy_parameter (acc.value_parameter)); } } - if (b.captured) { + if (!unreachable_exit_block && b.captured) { int block_id = get_block_id (b); var data_unref = new CCodeFunctionCall (new CCodeIdentifier ("block%d_data_unref".printf (block_id)));