]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Free intermediate temp-variables of postcondition expression
authorRico Tzschichholz <ricotz@ubuntu.com>
Tue, 9 Mar 2021 06:24:48 +0000 (07:24 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Tue, 9 Mar 2021 06:24:48 +0000 (07:24 +0100)
and not clearing "temp_ref_values" caused invalid references later.

Fixes https://gitlab.gnome.org/GNOME/vala/issues/80

codegen/valaccodebasemodule.vala
tests/Makefile.am
tests/methods/postconditions-temp-variables.vala [new file with mode: 0644]
tests/methods/preconditions-temp-variables.vala [new file with mode: 0644]

index 4df5b9e0a36c3b536880545ceb821935b241ae63..fa6f058f89f02dc0bbba4064e58b3e177c3d2917 100644 (file)
@@ -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 () {
index 3836fef781a9ac8af650e13a9910c08876276da4..eea0131e1d33fdf3bd7377f0eb03a3c716f7f256 100644 (file)
@@ -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 (file)
index 0000000..4641472
--- /dev/null
@@ -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 (file)
index 0000000..b116166
--- /dev/null
@@ -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");
+}