]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Fix floating reference regression with Variants
authorRico Tzschichholz <ricotz@ubuntu.com>
Sun, 12 Aug 2018 19:42:47 +0000 (21:42 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Mon, 13 Aug 2018 17:55:07 +0000 (19:55 +0200)
Let ConditionalExpression sink floating references.

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

codegen/valaccodebasemodule.vala
tests/Makefile.am
tests/semantic/floating-reference.vala [new file with mode: 0644]
vala/valaconditionalexpression.vala

index 14886a3cc6935824b4fd52daeb3c449ee9397c5d..2da65098a262fb4be52f469fef42f4bb9236588c 100644 (file)
@@ -5847,7 +5847,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                var result = ((GLibValue) value).copy ();
 
                if (type.value_owned
-                   && (target_type is GenericType || (target_type is ObjectType && !target_type.floating_reference))
+                   && (target_type == null || target_type is GenericType || !target_type.floating_reference)
                    && type.floating_reference) {
                        /* floating reference, sink it.
                         */
index 8d255e89d80e9db7c8360ecfec4bd2e3355de85c..d03e394c15301db2a99dd56c65fc45a3d8746ae1 100644 (file)
@@ -515,6 +515,7 @@ TESTS = \
        semantic/field-namespace-owned.test \
        semantic/field-non-constant.test \
        semantic/field-void.test \
+       semantic/floating-reference.vala \
        semantic/foreach-iterator-args.test \
        semantic/foreach-iterator-void.test \
        semantic/foreach-iterator-wrong-types.test \
diff --git a/tests/semantic/floating-reference.vala b/tests/semantic/floating-reference.vala
new file mode 100644 (file)
index 0000000..f690d69
--- /dev/null
@@ -0,0 +1,63 @@
+[CCode (returns_floating_reference = true)]
+Variant get_floating_variant () {
+       return new Variant.string ("foo");
+}
+
+void test_variant () {
+       {
+               string? @value = "bar";
+               Variant? variant = new Variant.string (@value) ?? new Variant.string (@value);
+               assert (variant.is_of_type (VariantType.STRING));
+               assert (!variant.is_floating ());
+       }
+       {
+               string? @value = "foo";
+               Variant? variant = @value == null ? null : new Variant.string (@value);
+               assert (variant.is_of_type (VariantType.STRING));
+               assert (!variant.is_floating ());
+       }
+       {
+               string? @value = "foo";
+               Variant? variant;
+               if (@value == null) {
+                       variant = null;
+               } else {
+                       variant = new Variant.string (@value);
+               }
+               assert (variant.is_of_type (VariantType.STRING));
+               assert (!variant.is_floating ());
+       }
+       {
+               bool @value = true;
+               Variant? variant = new Variant.boolean (@value);
+               assert (variant.is_of_type (VariantType.BOOLEAN));
+               assert (!variant.is_floating ());
+       }
+       {
+               string? @value = "manam";
+               Variant? variant = new Variant.string (@value);
+               assert (variant.is_of_type (VariantType.STRING));
+               assert (!variant.is_floating ());
+               string s = (string) variant;
+               assert (s == "manam");
+       }
+       {
+               Variant? variant = get_floating_variant ();
+               assert (!variant.is_floating ());
+       }
+}
+
+void test_variant_builder () {
+       string name = "foo";
+       string key = "bar";
+       Variant? @value = null;
+       var builder = new VariantBuilder (new VariantType ("a{smv}"));
+       builder.add ("{smv}", key, @value);
+       var variant = new Variant ("(s@a{smv})", name, builder.end ());
+       assert (!variant.is_floating ());
+}
+
+void main () {
+       test_variant ();
+       test_variant_builder ();
+}
index d139caeb45cd50769d2a84f4c3c20f9664a83f0a..71acf6d5380a3c05882874b44561d74dfbf43c02 100644 (file)
@@ -165,6 +165,7 @@ public class Vala.ConditionalExpression : Expression {
                }
 
                value_type.value_owned = (true_expression.value_type.value_owned || false_expression.value_type.value_owned);
+               value_type.floating_reference = false;
 
                local.variable_type = value_type;
                decl.check (context);