From: Rico Tzschichholz Date: Tue, 9 Mar 2021 06:24:48 +0000 (+0100) Subject: codegen: Free intermediate temp-variables of postcondition expression X-Git-Tag: 0.51.91~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a94816b2a6acfd2244aa090c3047e7e79eaa808d;p=thirdparty%2Fvala.git codegen: Free intermediate temp-variables of postcondition expression and not clearing "temp_ref_values" caused invalid references later. Fixes https://gitlab.gnome.org/GNOME/vala/issues/80 --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 4df5b9e0a..fa6f058f8 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -6538,6 +6538,12 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { requires_assert = true; ccode.add_expression (cassert); + + foreach (var value in temp_ref_values) { + ccode.add_expression (destroy_value (value)); + } + + temp_ref_values.clear (); } public unowned DataType? get_this_type () { diff --git a/tests/Makefile.am b/tests/Makefile.am index 3836fef78..eea0131e1 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -169,9 +169,11 @@ TESTS = \ methods/parameter-ref-array-resize-captured.vala \ methods/parameter-ref-delegate.vala \ methods/parameter-ref-element-access.vala \ + methods/preconditions-temp-variables.vala \ methods/prepostconditions.vala \ methods/prepostconditions-captured.vala \ methods/postconditions.vala \ + methods/postconditions-temp-variables.vala \ methods/return-unowned-delegate.vala \ methods/same-name.vala \ methods/symbolresolution.vala \ diff --git a/tests/methods/postconditions-temp-variables.vala b/tests/methods/postconditions-temp-variables.vala new file mode 100644 index 000000000..46414725d --- /dev/null +++ b/tests/methods/postconditions-temp-variables.vala @@ -0,0 +1,17 @@ +string foo () ensures (result.to_string () != "23") { + return 4711.to_string (); +} + +string bar (bool b) ensures (result.to_string () != "4711") { + if (b) { + return 23.to_string (); + } else { + return 42.to_string (); + } +} + +void main () { + assert (foo () == "4711"); + assert (bar (true) == "23"); + assert (bar (false) == "42"); +} diff --git a/tests/methods/preconditions-temp-variables.vala b/tests/methods/preconditions-temp-variables.vala new file mode 100644 index 000000000..b116166bb --- /dev/null +++ b/tests/methods/preconditions-temp-variables.vala @@ -0,0 +1,8 @@ +string foo (int i) requires (i.to_string () == "23" || i.to_string () == "42") { + return i.to_string (); +} + +void main () { + assert (foo (23) == "23"); + assert (foo (42) == "42"); +}