[vala/staging] codegen: Don't uncoditionally null check callback_func for GLib.Closure



commit 8105d9e3fa7e89187de1083a7b7ec3bf4c60c002
Author: Rico Tzschichholz <ricotz ubuntu com>
Date:   Mon Jan 24 10:17:46 2022 +0100

    codegen: Don't uncoditionally null check callback_func for GLib.Closure
    
    Found by -Werror=address with GCC 12
    
    See https://gitlab.gnome.org/GNOME/vala/issues/1282

 codegen/valaccodemethodcallmodule.vala         |  7 ++++++-
 tests/delegates/gclosure-conversion.c-expected | 12 +++++++++++-
 tests/delegates/gclosure-conversion.vala       |  4 +++-
 vala/valacastexpression.vala                   |  4 ++++
 vala/valamemberaccess.vala                     |  3 +++
 5 files changed, 27 insertions(+), 3 deletions(-)
---
diff --git a/codegen/valaccodemethodcallmodule.vala b/codegen/valaccodemethodcallmodule.vala
index 1e0b3ad95..d7827741b 100644
--- a/codegen/valaccodemethodcallmodule.vala
+++ b/codegen/valaccodemethodcallmodule.vala
@@ -437,7 +437,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
diff --git a/tests/delegates/gclosure-conversion.c-expected b/tests/delegates/gclosure-conversion.c-expected
index 991bb6f15..916299d7c 100644
--- a/tests/delegates/gclosure-conversion.c-expected
+++ b/tests/delegates/gclosure-conversion.c-expected
@@ -431,6 +431,9 @@ _vala_main (void)
        Foo* _tmp0_;
        Bar* bar = NULL;
        Bar* _tmp1_;
+       GBindingTransformFunc transform_to_func = NULL;
+       gpointer transform_to_func_target;
+       GDestroyNotify transform_to_func_target_destroy_notify;
        gint _tmp2_;
        gint _tmp3_;
        const gchar* _tmp4_;
@@ -439,7 +442,10 @@ _vala_main (void)
        foo = _tmp0_;
        _tmp1_ = bar_new ();
        bar = _tmp1_;
-       g_object_bind_property_with_closures (G_TYPE_CHECK_INSTANCE_CAST (foo, G_TYPE_OBJECT, GObject), 
"foo", G_TYPE_CHECK_INSTANCE_CAST (bar, G_TYPE_OBJECT, GObject), "bar", G_BINDING_BIDIRECTIONAL, (GClosure*) 
((((GBindingTransformFunc) to_int) == NULL) ? NULL : g_cclosure_new ((GCallback) ((GBindingTransformFunc) 
to_int), NULL, (GClosureNotify) NULL)), (GClosure*) ((((GBindingTransformFunc) to_string) == NULL) ? NULL : 
g_cclosure_new ((GCallback) ((GBindingTransformFunc) to_string), NULL, (GClosureNotify) NULL)));
+       transform_to_func = (GBindingTransformFunc) to_int;
+       transform_to_func_target = NULL;
+       transform_to_func_target_destroy_notify = NULL;
+       g_object_bind_property_with_closures (G_TYPE_CHECK_INSTANCE_CAST (foo, G_TYPE_OBJECT, GObject), 
"foo", G_TYPE_CHECK_INSTANCE_CAST (bar, G_TYPE_OBJECT, GObject), "bar", G_BINDING_BIDIRECTIONAL, (GClosure*) 
((transform_to_func == NULL) ? NULL : g_cclosure_new ((GCallback) transform_to_func, 
transform_to_func_target, (GClosureNotify) NULL)), (GClosure*) g_cclosure_new ((GCallback) 
((GBindingTransformFunc) to_string), NULL, (GClosureNotify) NULL));
        foo_set_foo (foo, "42");
        _tmp2_ = bar_get_bar (bar);
        _tmp3_ = _tmp2_;
@@ -448,6 +454,10 @@ _vala_main (void)
        _tmp4_ = foo_get_foo (foo);
        _tmp5_ = _tmp4_;
        _vala_assert (g_strcmp0 (_tmp5_, "23") == 0, "foo.foo == \"23\"");
+       (transform_to_func_target_destroy_notify == NULL) ? NULL : (transform_to_func_target_destroy_notify 
(transform_to_func_target), NULL);
+       transform_to_func = NULL;
+       transform_to_func_target = NULL;
+       transform_to_func_target_destroy_notify = NULL;
        _g_object_unref0 (bar);
        _g_object_unref0 (foo);
 }
diff --git a/tests/delegates/gclosure-conversion.vala b/tests/delegates/gclosure-conversion.vala
index 7df324a3a..e8c8b6e16 100644
--- a/tests/delegates/gclosure-conversion.vala
+++ b/tests/delegates/gclosure-conversion.vala
@@ -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);
diff --git a/vala/valacastexpression.vala b/vala/valacastexpression.vala
index 5d0783e41..95a708fec 100644
--- a/vala/valacastexpression.vala
+++ b/vala/valacastexpression.vala
@@ -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);
        }
diff --git a/vala/valamemberaccess.vala b/vala/valamemberaccess.vala
index 12154b0f6..d27a4266a 100644
--- a/vala/valamemberaccess.vala
+++ b/vala/valamemberaccess.vala
@@ -199,10 +199,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;
                }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]