]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Add cast to accessor calls for generic property implementations
authorRico Tzschichholz <ricotz@ubuntu.com>
Mon, 13 Mar 2023 08:13:34 +0000 (09:13 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Mon, 13 Mar 2023 08:13:34 +0000 (09:13 +0100)
Found by -Werror=int-conversion

codegen/valagobjectmodule.vala
tests/Makefile.am
tests/generics/class-property-override.c-expected [moved from tests/objects/bug667668.c-expected with 68% similarity]
tests/generics/class-property-override.vala [moved from tests/objects/bug667668.vala with 62% similarity]

index 638aab367f8f09426270fd56658a968ec9ca973c..457e7f2de4f89ce31772fa55639cc162cca1a34d 100644 (file)
@@ -273,7 +273,11 @@ public class Vala.GObjectModule : GTypeModule {
                                        csetcall.call = get_value_setter_function (prop.property_type);
                                }
                                csetcall.add_argument (new CCodeIdentifier ("value"));
-                               csetcall.add_argument (ccall);
+                               if (base_prop != null && prop != base_prop && base_prop.property_type is GenericType) {
+                                       csetcall.add_argument (convert_from_generic_pointer (ccall, prop.property_type));
+                               } else {
+                                       csetcall.add_argument (ccall);
+                               }
                                add_guarded_expression (prop, csetcall);
                                if (array_type != null && get_ccode_array_length (prop) && array_type.element_type.type_symbol == string_type.type_symbol) {
                                        ccode.close ();
@@ -407,7 +411,11 @@ public class Vala.GObjectModule : GTypeModule {
                                        cgetcall.call = new CCodeIdentifier ("g_value_get_pointer");
                                }
                                cgetcall.add_argument (new CCodeIdentifier ("value"));
-                               ccall.add_argument (cgetcall);
+                               if (base_prop != null && prop != base_prop && base_prop.property_type is GenericType) {
+                                       ccall.add_argument (convert_to_generic_pointer (cgetcall, prop.property_type));
+                               } else {
+                                       ccall.add_argument (cgetcall);
+                               }
                                add_guarded_expression (prop, ccall);
                        }
                        ccode.add_break ();
index 1b8d17ce90e2d8c2c1886ad74370b7b22dfad16e..b21e414c883739d91f581af9d1310840c9d309bf 100644 (file)
@@ -662,7 +662,6 @@ TESTS = \
        objects/bug654702.vala \
        objects/bug663134.vala \
        objects/bug664529.vala \
-       objects/bug667668.vala \
        objects/bug681356.vala \
        objects/bug683646.vala \
        objects/bug695671.vala \
@@ -791,6 +790,7 @@ TESTS = \
        generics/arrays-not-supported.test \
        generics/arrays-not-supported-2.test \
        generics/arrays-not-supported-3.test \
+       generics/class-property-override.vala \
        generics/constructor-chain-up.vala \
        generics/delegate-return-type-missing.test \
        generics/floating-type-cast.vala \
similarity index 68%
rename from tests/objects/bug667668.c-expected
rename to tests/generics/class-property-override.c-expected
index 5cc677e734ec474d534d82fcf2588025a8b1d772..0fa48bc6c1d52579b3d08e604b4e2b57c80dc244 100644 (file)
@@ -1,5 +1,5 @@
-/* objects_bug667668.c generated by valac, the Vala compiler
- * generated from objects_bug667668.vala, do not modify */
+/* generics_class_property_override.c generated by valac, the Vala compiler
+ * generated from generics_class_property_override.vala, do not modify */
 
 #include <glib-object.h>
 #include <glib.h>
@@ -53,6 +53,23 @@ enum  {
 };
 static GParamSpec* bar_properties[BAR_NUM_PROPERTIES];
 #define _g_free0(var) (var = (g_free (var), NULL))
+
+#define TYPE_MANAM (manam_get_type ())
+#define MANAM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_MANAM, Manam))
+#define MANAM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_MANAM, ManamClass))
+#define IS_MANAM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_MANAM))
+#define IS_MANAM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_MANAM))
+#define MANAM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_MANAM, ManamClass))
+
+typedef struct _Manam Manam;
+typedef struct _ManamClass ManamClass;
+typedef struct _ManamPrivate ManamPrivate;
+enum  {
+       MANAM_0_PROPERTY,
+       MANAM_FOO_PROPERTY,
+       MANAM_NUM_PROPERTIES
+};
+static GParamSpec* manam_properties[MANAM_NUM_PROPERTIES];
 #define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
 #define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg);
 #define _vala_return_if_fail(expr, msg) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return; }
@@ -89,10 +106,25 @@ struct _BarPrivate {
        gchar* _foo;
 };
 
+struct _Manam {
+       Foo parent_instance;
+       ManamPrivate * priv;
+};
+
+struct _ManamClass {
+       FooClass parent_class;
+};
+
+struct _ManamPrivate {
+       gint _foo;
+};
+
 static gint Foo_private_offset;
 static gpointer foo_parent_class = NULL;
 static gint Bar_private_offset;
 static gpointer bar_parent_class = NULL;
+static gint Manam_private_offset;
+static gpointer manam_parent_class = NULL;
 
 VALA_EXTERN GType foo_get_type (void) G_GNUC_CONST ;
 G_DEFINE_AUTOPTR_CLEANUP_FUNC (Foo, g_object_unref)
@@ -126,6 +158,20 @@ static void _vala_bar_set_property (GObject * object,
                              guint property_id,
                              const GValue * value,
                              GParamSpec * pspec);
+VALA_EXTERN GType manam_get_type (void) G_GNUC_CONST ;
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (Manam, g_object_unref)
+VALA_EXTERN Manam* manam_new (void);
+VALA_EXTERN Manam* manam_construct (GType object_type);
+static void manam_finalize (GObject * obj);
+static GType manam_get_type_once (void);
+static void _vala_manam_get_property (GObject * object,
+                               guint property_id,
+                               GValue * value,
+                               GParamSpec * pspec);
+static void _vala_manam_set_property (GObject * object,
+                               guint property_id,
+                               const GValue * value,
+                               GParamSpec * pspec);
 static void _vala_main (void);
 
 static inline gpointer
@@ -374,7 +420,7 @@ _vala_bar_get_property (GObject * object,
        self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_BAR, Bar);
        switch (property_id) {
                case BAR_FOO_PROPERTY:
-               g_value_set_string (value, foo_get_foo (G_TYPE_CHECK_INSTANCE_CAST (self, TYPE_FOO, Foo)));
+               g_value_set_string (value, (gchar*) foo_get_foo (G_TYPE_CHECK_INSTANCE_CAST (self, TYPE_FOO, Foo)));
                break;
                default:
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -400,6 +446,137 @@ _vala_bar_set_property (GObject * object,
        }
 }
 
+static inline gpointer
+manam_get_instance_private (Manam* self)
+{
+       return G_STRUCT_MEMBER_P (self, Manam_private_offset);
+}
+
+Manam*
+manam_construct (GType object_type)
+{
+       Manam * self = NULL;
+       self = (Manam*) foo_construct (object_type, G_TYPE_INT, NULL, NULL);
+       return self;
+}
+
+Manam*
+manam_new (void)
+{
+       return manam_construct (TYPE_MANAM);
+}
+
+static gint
+manam_real_get_foo (Foo* base)
+{
+       gint result;
+       Manam* self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (base, TYPE_MANAM, Manam);
+       result = self->priv->_foo;
+       return result;
+}
+
+static void
+manam_real_set_foo (Foo* base,
+                    gint value)
+{
+       Manam* self;
+       gint old_value;
+       self = G_TYPE_CHECK_INSTANCE_CAST (base, TYPE_MANAM, Manam);
+       old_value = manam_real_get_foo (base);
+       if (old_value != value) {
+               self->priv->_foo = value;
+               g_object_notify_by_pspec ((GObject *) self, manam_properties[MANAM_FOO_PROPERTY]);
+       }
+}
+
+static void
+manam_class_init (ManamClass * klass,
+                  gpointer klass_data)
+{
+       manam_parent_class = g_type_class_peek_parent (klass);
+       g_type_class_adjust_private_offset (klass, &Manam_private_offset);
+       FOO_CLASS (klass)->get_foo = (gconstpointer (*) (Foo*)) manam_real_get_foo;
+       FOO_CLASS (klass)->set_foo = (void (*) (Foo*, gconstpointer)) manam_real_set_foo;
+       G_OBJECT_CLASS (klass)->get_property = _vala_manam_get_property;
+       G_OBJECT_CLASS (klass)->set_property = _vala_manam_set_property;
+       G_OBJECT_CLASS (klass)->finalize = manam_finalize;
+       g_object_class_install_property (G_OBJECT_CLASS (klass), MANAM_FOO_PROPERTY, manam_properties[MANAM_FOO_PROPERTY] = g_param_spec_int ("foo", "foo", "foo", G_MININT, G_MAXINT, 0, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE));
+}
+
+static void
+manam_instance_init (Manam * self,
+                     gpointer klass)
+{
+       self->priv = manam_get_instance_private (self);
+}
+
+static void
+manam_finalize (GObject * obj)
+{
+       Manam * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (obj, TYPE_MANAM, Manam);
+       G_OBJECT_CLASS (manam_parent_class)->finalize (obj);
+}
+
+static GType
+manam_get_type_once (void)
+{
+       static const GTypeInfo g_define_type_info = { sizeof (ManamClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) manam_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (Manam), 0, (GInstanceInitFunc) manam_instance_init, NULL };
+       GType manam_type_id;
+       manam_type_id = g_type_register_static (TYPE_FOO, "Manam", &g_define_type_info, 0);
+       Manam_private_offset = g_type_add_instance_private (manam_type_id, sizeof (ManamPrivate));
+       return manam_type_id;
+}
+
+GType
+manam_get_type (void)
+{
+       static volatile gsize manam_type_id__once = 0;
+       if (g_once_init_enter (&manam_type_id__once)) {
+               GType manam_type_id;
+               manam_type_id = manam_get_type_once ();
+               g_once_init_leave (&manam_type_id__once, manam_type_id);
+       }
+       return manam_type_id__once;
+}
+
+static void
+_vala_manam_get_property (GObject * object,
+                          guint property_id,
+                          GValue * value,
+                          GParamSpec * pspec)
+{
+       Manam * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_MANAM, Manam);
+       switch (property_id) {
+               case MANAM_FOO_PROPERTY:
+               g_value_set_int (value, (gint) ((gintptr) foo_get_foo (G_TYPE_CHECK_INSTANCE_CAST (self, TYPE_FOO, Foo))));
+               break;
+               default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+               break;
+       }
+}
+
+static void
+_vala_manam_set_property (GObject * object,
+                          guint property_id,
+                          const GValue * value,
+                          GParamSpec * pspec)
+{
+       Manam * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_MANAM, Manam);
+       switch (property_id) {
+               case MANAM_FOO_PROPERTY:
+               foo_set_foo (G_TYPE_CHECK_INSTANCE_CAST (self, TYPE_FOO, Foo), (gpointer) ((gintptr) g_value_get_int (value)));
+               break;
+               default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+               break;
+       }
+}
+
 static void
 _vala_main (void)
 {
@@ -407,12 +584,23 @@ _vala_main (void)
        Bar* _tmp0_;
        gconstpointer _tmp1_;
        gconstpointer _tmp2_;
+       Manam* manam = NULL;
+       Manam* _tmp3_;
+       gconstpointer _tmp4_;
+       gconstpointer _tmp5_;
        _tmp0_ = bar_new ();
        bar = _tmp0_;
        foo_set_foo (G_TYPE_CHECK_INSTANCE_CAST (bar, TYPE_FOO, Foo), "foo");
        _tmp1_ = foo_get_foo (G_TYPE_CHECK_INSTANCE_CAST (bar, TYPE_FOO, Foo));
        _tmp2_ = _tmp1_;
        _vala_assert (g_strcmp0 ((const gchar*) _tmp2_, "foo") == 0, "bar.foo == \"foo\"");
+       _tmp3_ = manam_new ();
+       manam = _tmp3_;
+       foo_set_foo (G_TYPE_CHECK_INSTANCE_CAST (manam, TYPE_FOO, Foo), (gpointer) ((gintptr) 42));
+       _tmp4_ = foo_get_foo (G_TYPE_CHECK_INSTANCE_CAST (manam, TYPE_FOO, Foo));
+       _tmp5_ = _tmp4_;
+       _vala_assert (((gint) ((gintptr) _tmp5_)) == 42, "manam.foo == 42");
+       _g_object_unref0 (manam);
        _g_object_unref0 (bar);
 }
 
similarity index 62%
rename from tests/objects/bug667668.vala
rename to tests/generics/class-property-override.vala
index 8f760c7bef44924e1d83e626d2a9f2142d215b2f..e673ab7222d13443da76ef66e29fc1afd461f3fd 100644 (file)
@@ -6,8 +6,16 @@ public class Bar : Foo<string> {
        public override string foo { get; set; }
 }
 
+public class Manam : Foo<int> {
+       public override int foo { get; set; }
+}
+
 void main () {
        var bar = new Bar ();
        bar.foo = "foo";
        assert (bar.foo == "foo");
+
+       var manam = new Manam ();
+       manam.foo = 42;
+       assert (manam.foo == 42);
 }