]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Don't uncoditionally null check callback_func for GLib.Closure
authorRico Tzschichholz <ricotz@ubuntu.com>
Mon, 24 Jan 2022 09:17:46 +0000 (10:17 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Wed, 9 Feb 2022 21:19:46 +0000 (22:19 +0100)
Found by -Werror=address with GCC 12

See https://gitlab.gnome.org/GNOME/vala/issues/1282

codegen/valaccodemethodcallmodule.vala
tests/delegates/gclosure-conversion.vala
vala/valacastexpression.vala
vala/valamemberaccess.vala

index 8fa45ed374888a08b5daca6a47d5fa42dd4d7b11..3098daa6fff1515ff62742025f6a789645d31d44 100644 (file)
@@ -460,7 +460,12 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                                                                        closure_new.add_argument (new CCodeCastExpression (cexpr, "GCallback"));
                                                                        closure_new.add_argument (delegate_target);
                                                                        closure_new.add_argument (new CCodeCastExpression (delegate_target_destroy_notify, "GClosureNotify"));
-                                                                       cexpr = new CCodeConditionalExpression (new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, cexpr, new CCodeConstant ("NULL")), new CCodeConstant ("NULL"), closure_new);
+                                                                       //TODO Use get_non_null (arg.target_value)
+                                                                       if (arg.is_non_null ()) {
+                                                                               cexpr = closure_new;
+                                                                       } else {
+                                                                               cexpr = new CCodeConditionalExpression (new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, cexpr, new CCodeConstant ("NULL")), new CCodeConstant ("NULL"), closure_new);
+                                                                       }
                                                                } else {
                                                                        // Override previously given target/destroy only if it was NULL
                                                                        // TODO https://gitlab.gnome.org/GNOME/vala/issues/59
index 7df324a3a8227cc1040aaae6d6eea0e3b6759d0f..e8c8b6e1636f46b65312a608e75f13cd8d326a86 100644 (file)
@@ -20,8 +20,10 @@ void main () {
        var foo = new Foo ();
        var bar = new Bar ();
 
+       BindingTransformFunc transform_to_func = (BindingTransformFunc) to_int;
+
        foo.bind_property ("foo", bar, "bar", BindingFlags.BIDIRECTIONAL,
-               (BindingTransformFunc) to_int, (BindingTransformFunc) to_string);
+               transform_to_func, (BindingTransformFunc) to_string);
 
        foo.foo = "42";
        assert (bar.bar == 42);
index 1d1dbb0f2a3aa1841843b400f5d76504585f1b4f..bc8441ac95fc8600cb339f56d5f74f87ba0d0896 100644 (file)
@@ -132,6 +132,10 @@ public class Vala.CastExpression : Expression {
                }
        }
 
+       public override bool is_non_null () {
+               return is_non_null_cast || (!is_silent_cast && inner.is_non_null ());
+       }
+
        public override void get_error_types (Collection<DataType> collection, SourceReference? source_reference = null) {
                inner.get_error_types (collection, source_reference);
        }
index a56b7cf782a4394968ec1cedf4294314aba74cdf..35c5bdc984a28c2677696e43c87fdcb6c0f3f3c5 100644 (file)
@@ -194,10 +194,13 @@ public class Vala.MemberAccess : Expression {
        public override bool is_non_null () {
                unowned Constant? c = symbol_reference as Constant;
                unowned LocalVariable? l = symbol_reference as LocalVariable;
+               unowned Method? m = symbol_reference as Method;
                if (c != null) {
                        return (c is EnumValue || !c.type_reference.nullable);
                } else if (l != null) {
                        return (l.variable_type is ArrayType && ((ArrayType) l.variable_type).inline_allocated);
+               } else if (m != null) {
+                       return (m.binding == MemberBinding.STATIC || prototype_access);
                } else {
                        return false;
                }