summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2023-03-13 09:13:34 +0100
committerRico Tzschichholz <ricotz@ubuntu.com>2023-03-13 09:13:34 +0100
commitc2093183099e4da3e00da38a3a6de18c319f4c87 (patch)
treee36455aed8de011164f4686926bcab3d06c8e323
parentd5ecd13849a6a9126d3b90d16a3268f860800b41 (diff)
downloadvala-c2093183099e4da3e00da38a3a6de18c319f4c87.tar.gz
codegen: Add cast to accessor calls for generic property implementations
Found by -Werror=int-conversion
-rw-r--r--codegen/valagobjectmodule.vala12
-rw-r--r--tests/Makefile.am2
-rw-r--r--tests/generics/class-property-override.c-expected (renamed from tests/objects/bug667668.c-expected)194
-rw-r--r--tests/generics/class-property-override.vala (renamed from tests/objects/bug667668.vala)8
4 files changed, 210 insertions, 6 deletions
diff --git a/codegen/valagobjectmodule.vala b/codegen/valagobjectmodule.vala
index 638aab367..457e7f2de 100644
--- a/codegen/valagobjectmodule.vala
+++ b/codegen/valagobjectmodule.vala
@@ -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 ();
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 1b8d17ce9..b21e414c8 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -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 \
diff --git a/tests/objects/bug667668.c-expected b/tests/generics/class-property-override.c-expected
index 5cc677e73..0fa48bc6c 100644
--- a/tests/objects/bug667668.c-expected
+++ b/tests/generics/class-property-override.c-expected
@@ -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);
}
diff --git a/tests/objects/bug667668.vala b/tests/generics/class-property-override.vala
index 8f760c7be..e673ab722 100644
--- a/tests/objects/bug667668.vala
+++ b/tests/generics/class-property-override.vala
@@ -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);
}