/* methods_bug652098.c generated by valac, the Vala compiler
 * generated from methods_bug652098.vala, do not modify */

#include <glib-object.h>
#include <glib.h>

#if !defined(VALA_STRICT_C)
#if !defined(__clang__) && defined(__GNUC__) && (__GNUC__ >= 14)
#pragma GCC diagnostic warning "-Wincompatible-pointer-types"
#elif defined(__clang__) && (__clang_major__ >= 16)
#pragma clang diagnostic ignored "-Wincompatible-function-pointer-types"
#pragma clang diagnostic ignored "-Wincompatible-pointer-types"
#endif
#endif
#if !defined(VALA_EXTERN)
#if defined(_MSC_VER)
#define VALA_EXTERN __declspec(dllexport) extern
#elif __GNUC__ >= 4
#define VALA_EXTERN __attribute__((visibility("default"))) extern
#else
#define VALA_EXTERN extern
#endif
#endif

#define TYPE_IFACE1 (iface1_get_type ())
#define IFACE1(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_IFACE1, Iface1))
#define IS_IFACE1(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_IFACE1))
#define IFACE1_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TYPE_IFACE1, Iface1Iface))

typedef struct _Iface1 Iface1;
typedef struct _Iface1Iface Iface1Iface;

#define TYPE_IFACE2 (iface2_get_type ())
#define IFACE2(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_IFACE2, Iface2))
#define IS_IFACE2(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_IFACE2))
#define IFACE2_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TYPE_IFACE2, Iface2Iface))

typedef struct _Iface2 Iface2;
typedef struct _Iface2Iface Iface2Iface;

#define TYPE_OBJ1 (obj1_get_type ())
#define OBJ1(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_OBJ1, Obj1))
#define OBJ1_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_OBJ1, Obj1Class))
#define IS_OBJ1(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_OBJ1))
#define IS_OBJ1_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_OBJ1))
#define OBJ1_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_OBJ1, Obj1Class))

typedef struct _Obj1 Obj1;
typedef struct _Obj1Class Obj1Class;
typedef struct _Obj1Private Obj1Private;
enum  {
	OBJ1_0_PROPERTY,
	OBJ1_NUM_PROPERTIES
};
static GParamSpec* obj1_properties[OBJ1_NUM_PROPERTIES];

#define TYPE_OBJ2 (obj2_get_type ())
#define OBJ2(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_OBJ2, Obj2))
#define OBJ2_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_OBJ2, Obj2Class))
#define IS_OBJ2(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_OBJ2))
#define IS_OBJ2_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_OBJ2))
#define OBJ2_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_OBJ2, Obj2Class))

typedef struct _Obj2 Obj2;
typedef struct _Obj2Class Obj2Class;
typedef struct _Obj2Private Obj2Private;
enum  {
	OBJ2_0_PROPERTY,
	OBJ2_NUM_PROPERTIES
};
static GParamSpec* obj2_properties[OBJ2_NUM_PROPERTIES];

#define TYPE_BASE (base_get_type ())
#define BASE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_BASE, Base))
#define BASE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_BASE, BaseClass))
#define IS_BASE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_BASE))
#define IS_BASE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_BASE))
#define BASE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_BASE, BaseClass))

typedef struct _Base Base;
typedef struct _BaseClass BaseClass;
typedef struct _BasePrivate BasePrivate;
enum  {
	BASE_0_PROPERTY,
	BASE_NUM_PROPERTIES
};
static GParamSpec* base_properties[BASE_NUM_PROPERTIES];

#define TYPE_IFACE (iface_get_type ())
#define IFACE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_IFACE, Iface))
#define IS_IFACE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_IFACE))
#define IFACE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TYPE_IFACE, IfaceIface))

typedef struct _Iface Iface;
typedef struct _IfaceIface IfaceIface;

#define TYPE_CONCRETE (concrete_get_type ())
#define CONCRETE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_CONCRETE, Concrete))
#define CONCRETE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_CONCRETE, ConcreteClass))
#define IS_CONCRETE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_CONCRETE))
#define IS_CONCRETE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_CONCRETE))
#define CONCRETE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_CONCRETE, ConcreteClass))

typedef struct _Concrete Concrete;
typedef struct _ConcreteClass ConcreteClass;
typedef struct _ConcretePrivate ConcretePrivate;
enum  {
	CONCRETE_0_PROPERTY,
	CONCRETE_NUM_PROPERTIES
};
static GParamSpec* concrete_properties[CONCRETE_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; }
#define _vala_return_val_if_fail(expr, msg, val) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return val; }
#define _vala_warn_if_fail(expr, msg) if G_LIKELY (expr) ; else g_warn_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg);

struct _Iface1Iface {
	GTypeInterface parent_iface;
	gint (*foo) (Iface1* self);
};

struct _Iface2Iface {
	GTypeInterface parent_iface;
	gint (*foo) (Iface2* self);
};

struct _Obj1 {
	GObject parent_instance;
	Obj1Private * priv;
};

struct _Obj1Class {
	GObjectClass parent_class;
};

struct _Obj2 {
	GObject parent_instance;
	Obj2Private * priv;
};

struct _Obj2Class {
	GObjectClass parent_class;
};

struct _Base {
	GObject parent_instance;
	BasePrivate * priv;
};

struct _BaseClass {
	GObjectClass parent_class;
};

struct _IfaceIface {
	GTypeInterface parent_iface;
	gint (*foo) (Iface* self);
};

struct _Concrete {
	Base parent_instance;
	ConcretePrivate * priv;
};

struct _ConcreteClass {
	BaseClass parent_class;
};

static gpointer obj1_parent_class = NULL;
static Iface1Iface * obj1_iface1_parent_iface = NULL;
static Iface2Iface * obj1_iface2_parent_iface = NULL;
static gpointer obj2_parent_class = NULL;
static Iface1Iface * obj2_iface1_parent_iface = NULL;
static Iface2Iface * obj2_iface2_parent_iface = NULL;
static gpointer base_parent_class = NULL;
static gpointer concrete_parent_class = NULL;
static IfaceIface * concrete_iface_parent_iface = NULL;

VALA_EXTERN GType iface1_get_type (void) G_GNUC_CONST ;
G_DEFINE_AUTOPTR_CLEANUP_FUNC (Iface1, g_object_unref)
VALA_EXTERN gint iface1_foo (Iface1* self);
static GType iface1_get_type_once (void);
VALA_EXTERN GType iface2_get_type (void) G_GNUC_CONST ;
G_DEFINE_AUTOPTR_CLEANUP_FUNC (Iface2, g_object_unref)
VALA_EXTERN gint iface2_foo (Iface2* self);
static GType iface2_get_type_once (void);
VALA_EXTERN GType obj1_get_type (void) G_GNUC_CONST ;
G_DEFINE_AUTOPTR_CLEANUP_FUNC (Obj1, g_object_unref)
static gint obj1_real_iface1_foo (Iface1* base);
static gint obj1_real_iface2_foo (Iface2* base);
VALA_EXTERN Obj1* obj1_new (void);
VALA_EXTERN Obj1* obj1_construct (GType object_type);
static GType obj1_get_type_once (void);
VALA_EXTERN GType obj2_get_type (void) G_GNUC_CONST ;
G_DEFINE_AUTOPTR_CLEANUP_FUNC (Obj2, g_object_unref)
static gint obj2_real_iface1_foo (Iface1* base);
static gint obj2_real_foo (Iface2* base);
VALA_EXTERN Obj2* obj2_new (void);
VALA_EXTERN Obj2* obj2_construct (GType object_type);
static GType obj2_get_type_once (void);
VALA_EXTERN GType base_get_type (void) G_GNUC_CONST ;
G_DEFINE_AUTOPTR_CLEANUP_FUNC (Base, g_object_unref)
VALA_EXTERN gint base_foo (Base* self);
VALA_EXTERN Base* base_new (void);
VALA_EXTERN Base* base_construct (GType object_type);
static GType base_get_type_once (void);
VALA_EXTERN GType iface_get_type (void) G_GNUC_CONST ;
G_DEFINE_AUTOPTR_CLEANUP_FUNC (Iface, g_object_unref)
VALA_EXTERN gint iface_foo (Iface* self);
static GType iface_get_type_once (void);
VALA_EXTERN GType concrete_get_type (void) G_GNUC_CONST ;
G_DEFINE_AUTOPTR_CLEANUP_FUNC (Concrete, g_object_unref)
VALA_EXTERN Concrete* concrete_new (void);
VALA_EXTERN Concrete* concrete_construct (GType object_type);
static GType concrete_get_type_once (void);
static void _vala_main (void);

gint
iface1_foo (Iface1* self)
{
	Iface1Iface* _iface_;
	g_return_val_if_fail (IS_IFACE1 (self), 0);
	_iface_ = IFACE1_GET_INTERFACE (self);
	if (_iface_->foo) {
		return _iface_->foo (self);
	}
	return -1;
}

static void
iface1_default_init (Iface1Iface * iface,
                     gpointer iface_data)
{
}

static GType
iface1_get_type_once (void)
{
	static const GTypeInfo g_define_type_info = { sizeof (Iface1Iface), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) iface1_default_init, (GClassFinalizeFunc) NULL, NULL, 0, 0, (GInstanceInitFunc) NULL, NULL };
	GType iface1_type_id;
	iface1_type_id = g_type_register_static (G_TYPE_INTERFACE, "Iface1", &g_define_type_info, 0);
	g_type_interface_add_prerequisite (iface1_type_id, G_TYPE_OBJECT);
	return iface1_type_id;
}

GType
iface1_get_type (void)
{
	static volatile gsize iface1_type_id__once = 0;
	if (g_once_init_enter (&iface1_type_id__once)) {
		GType iface1_type_id;
		iface1_type_id = iface1_get_type_once ();
		g_once_init_leave (&iface1_type_id__once, iface1_type_id);
	}
	return iface1_type_id__once;
}

gint
iface2_foo (Iface2* self)
{
	Iface2Iface* _iface_;
	g_return_val_if_fail (IS_IFACE2 (self), 0);
	_iface_ = IFACE2_GET_INTERFACE (self);
	if (_iface_->foo) {
		return _iface_->foo (self);
	}
	return -1;
}

static void
iface2_default_init (Iface2Iface * iface,
                     gpointer iface_data)
{
}

static GType
iface2_get_type_once (void)
{
	static const GTypeInfo g_define_type_info = { sizeof (Iface2Iface), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) iface2_default_init, (GClassFinalizeFunc) NULL, NULL, 0, 0, (GInstanceInitFunc) NULL, NULL };
	GType iface2_type_id;
	iface2_type_id = g_type_register_static (G_TYPE_INTERFACE, "Iface2", &g_define_type_info, 0);
	g_type_interface_add_prerequisite (iface2_type_id, G_TYPE_OBJECT);
	return iface2_type_id;
}

GType
iface2_get_type (void)
{
	static volatile gsize iface2_type_id__once = 0;
	if (g_once_init_enter (&iface2_type_id__once)) {
		GType iface2_type_id;
		iface2_type_id = iface2_get_type_once ();
		g_once_init_leave (&iface2_type_id__once, iface2_type_id);
	}
	return iface2_type_id__once;
}

static gint
obj1_real_iface1_foo (Iface1* base)
{
	Obj1 * self;
	gint result;
	self = G_TYPE_CHECK_INSTANCE_CAST (base, TYPE_OBJ1, Obj1);
	result = 1;
	return result;
}

static gint
obj1_real_iface2_foo (Iface2* base)
{
	Obj1 * self;
	gint result;
	self = G_TYPE_CHECK_INSTANCE_CAST (base, TYPE_OBJ1, Obj1);
	result = 2;
	return result;
}

Obj1*
obj1_construct (GType object_type)
{
	Obj1 * self = NULL;
	self = (Obj1*) g_object_new (object_type, NULL);
	return self;
}

Obj1*
obj1_new (void)
{
	return obj1_construct (TYPE_OBJ1);
}

static void
obj1_class_init (Obj1Class * klass,
                 gpointer klass_data)
{
	obj1_parent_class = g_type_class_peek_parent (klass);
}

static void
obj1_iface1_interface_init (Iface1Iface * iface,
                            gpointer iface_data)
{
	obj1_iface1_parent_iface = g_type_interface_peek_parent (iface);
	iface->foo = (gint (*) (Iface1*)) obj1_real_iface1_foo;
}

static void
obj1_iface2_interface_init (Iface2Iface * iface,
                            gpointer iface_data)
{
	obj1_iface2_parent_iface = g_type_interface_peek_parent (iface);
	iface->foo = (gint (*) (Iface2*)) obj1_real_iface2_foo;
}

static void
obj1_instance_init (Obj1 * self,
                    gpointer klass)
{
}

static GType
obj1_get_type_once (void)
{
	static const GTypeInfo g_define_type_info = { sizeof (Obj1Class), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) obj1_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (Obj1), 0, (GInstanceInitFunc) obj1_instance_init, NULL };
	static const GInterfaceInfo iface1_info = { (GInterfaceInitFunc) obj1_iface1_interface_init, (GInterfaceFinalizeFunc) NULL, NULL};
	static const GInterfaceInfo iface2_info = { (GInterfaceInitFunc) obj1_iface2_interface_init, (GInterfaceFinalizeFunc) NULL, NULL};
	GType obj1_type_id;
	obj1_type_id = g_type_register_static (G_TYPE_OBJECT, "Obj1", &g_define_type_info, 0);
	g_type_add_interface_static (obj1_type_id, TYPE_IFACE1, &iface1_info);
	g_type_add_interface_static (obj1_type_id, TYPE_IFACE2, &iface2_info);
	return obj1_type_id;
}

GType
obj1_get_type (void)
{
	static volatile gsize obj1_type_id__once = 0;
	if (g_once_init_enter (&obj1_type_id__once)) {
		GType obj1_type_id;
		obj1_type_id = obj1_get_type_once ();
		g_once_init_leave (&obj1_type_id__once, obj1_type_id);
	}
	return obj1_type_id__once;
}

static gint
obj2_real_iface1_foo (Iface1* base)
{
	Obj2 * self;
	gint result;
	self = G_TYPE_CHECK_INSTANCE_CAST (base, TYPE_OBJ2, Obj2);
	result = 1;
	return result;
}

static gint
obj2_real_foo (Iface2* base)
{
	Obj2 * self;
	gint result;
	self = G_TYPE_CHECK_INSTANCE_CAST (base, TYPE_OBJ2, Obj2);
	result = 2;
	return result;
}

Obj2*
obj2_construct (GType object_type)
{
	Obj2 * self = NULL;
	self = (Obj2*) g_object_new (object_type, NULL);
	return self;
}

Obj2*
obj2_new (void)
{
	return obj2_construct (TYPE_OBJ2);
}

static void
obj2_class_init (Obj2Class * klass,
                 gpointer klass_data)
{
	obj2_parent_class = g_type_class_peek_parent (klass);
}

static void
obj2_iface1_interface_init (Iface1Iface * iface,
                            gpointer iface_data)
{
	obj2_iface1_parent_iface = g_type_interface_peek_parent (iface);
	iface->foo = (gint (*) (Iface1*)) obj2_real_iface1_foo;
}

static void
obj2_iface2_interface_init (Iface2Iface * iface,
                            gpointer iface_data)
{
	obj2_iface2_parent_iface = g_type_interface_peek_parent (iface);
	iface->foo = (gint (*) (Iface2*)) obj2_real_foo;
}

static void
obj2_instance_init (Obj2 * self,
                    gpointer klass)
{
}

static GType
obj2_get_type_once (void)
{
	static const GTypeInfo g_define_type_info = { sizeof (Obj2Class), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) obj2_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (Obj2), 0, (GInstanceInitFunc) obj2_instance_init, NULL };
	static const GInterfaceInfo iface1_info = { (GInterfaceInitFunc) obj2_iface1_interface_init, (GInterfaceFinalizeFunc) NULL, NULL};
	static const GInterfaceInfo iface2_info = { (GInterfaceInitFunc) obj2_iface2_interface_init, (GInterfaceFinalizeFunc) NULL, NULL};
	GType obj2_type_id;
	obj2_type_id = g_type_register_static (G_TYPE_OBJECT, "Obj2", &g_define_type_info, 0);
	g_type_add_interface_static (obj2_type_id, TYPE_IFACE1, &iface1_info);
	g_type_add_interface_static (obj2_type_id, TYPE_IFACE2, &iface2_info);
	return obj2_type_id;
}

GType
obj2_get_type (void)
{
	static volatile gsize obj2_type_id__once = 0;
	if (g_once_init_enter (&obj2_type_id__once)) {
		GType obj2_type_id;
		obj2_type_id = obj2_get_type_once ();
		g_once_init_leave (&obj2_type_id__once, obj2_type_id);
	}
	return obj2_type_id__once;
}

gint
base_foo (Base* self)
{
	gint result;
	g_return_val_if_fail (IS_BASE (self), 0);
	result = 42;
	return result;
}

Base*
base_construct (GType object_type)
{
	Base * self = NULL;
	self = (Base*) g_object_new (object_type, NULL);
	return self;
}

Base*
base_new (void)
{
	return base_construct (TYPE_BASE);
}

static void
base_class_init (BaseClass * klass,
                 gpointer klass_data)
{
	base_parent_class = g_type_class_peek_parent (klass);
}

static void
base_instance_init (Base * self,
                    gpointer klass)
{
}

static GType
base_get_type_once (void)
{
	static const GTypeInfo g_define_type_info = { sizeof (BaseClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) base_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (Base), 0, (GInstanceInitFunc) base_instance_init, NULL };
	GType base_type_id;
	base_type_id = g_type_register_static (G_TYPE_OBJECT, "Base", &g_define_type_info, 0);
	return base_type_id;
}

GType
base_get_type (void)
{
	static volatile gsize base_type_id__once = 0;
	if (g_once_init_enter (&base_type_id__once)) {
		GType base_type_id;
		base_type_id = base_get_type_once ();
		g_once_init_leave (&base_type_id__once, base_type_id);
	}
	return base_type_id__once;
}

gint
iface_foo (Iface* self)
{
	IfaceIface* _iface_;
	g_return_val_if_fail (IS_IFACE (self), 0);
	_iface_ = IFACE_GET_INTERFACE (self);
	if (_iface_->foo) {
		return _iface_->foo (self);
	}
	return -1;
}

static void
iface_default_init (IfaceIface * iface,
                    gpointer iface_data)
{
}

static GType
iface_get_type_once (void)
{
	static const GTypeInfo g_define_type_info = { sizeof (IfaceIface), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) iface_default_init, (GClassFinalizeFunc) NULL, NULL, 0, 0, (GInstanceInitFunc) NULL, NULL };
	GType iface_type_id;
	iface_type_id = g_type_register_static (G_TYPE_INTERFACE, "Iface", &g_define_type_info, 0);
	g_type_interface_add_prerequisite (iface_type_id, G_TYPE_OBJECT);
	return iface_type_id;
}

GType
iface_get_type (void)
{
	static volatile gsize iface_type_id__once = 0;
	if (g_once_init_enter (&iface_type_id__once)) {
		GType iface_type_id;
		iface_type_id = iface_get_type_once ();
		g_once_init_leave (&iface_type_id__once, iface_type_id);
	}
	return iface_type_id__once;
}

Concrete*
concrete_construct (GType object_type)
{
	Concrete * self = NULL;
	self = (Concrete*) base_construct (object_type);
	return self;
}

Concrete*
concrete_new (void)
{
	return concrete_construct (TYPE_CONCRETE);
}

static void
concrete_class_init (ConcreteClass * klass,
                     gpointer klass_data)
{
	concrete_parent_class = g_type_class_peek_parent (klass);
}

static void
concrete_iface_interface_init (IfaceIface * iface,
                               gpointer iface_data)
{
	concrete_iface_parent_iface = g_type_interface_peek_parent (iface);
	iface->foo = (gint (*) (Iface*)) base_foo;
}

static void
concrete_instance_init (Concrete * self,
                        gpointer klass)
{
}

static GType
concrete_get_type_once (void)
{
	static const GTypeInfo g_define_type_info = { sizeof (ConcreteClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) concrete_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (Concrete), 0, (GInstanceInitFunc) concrete_instance_init, NULL };
	static const GInterfaceInfo iface_info = { (GInterfaceInitFunc) concrete_iface_interface_init, (GInterfaceFinalizeFunc) NULL, NULL};
	GType concrete_type_id;
	concrete_type_id = g_type_register_static (TYPE_BASE, "Concrete", &g_define_type_info, 0);
	g_type_add_interface_static (concrete_type_id, TYPE_IFACE, &iface_info);
	return concrete_type_id;
}

GType
concrete_get_type (void)
{
	static volatile gsize concrete_type_id__once = 0;
	if (g_once_init_enter (&concrete_type_id__once)) {
		GType concrete_type_id;
		concrete_type_id = concrete_get_type_once ();
		g_once_init_leave (&concrete_type_id__once, concrete_type_id);
	}
	return concrete_type_id__once;
}

static gpointer
_g_object_ref0 (gpointer self)
{
	return self ? g_object_ref (self) : NULL;
}

static void
_vala_main (void)
{
	Obj1* obj1 = NULL;
	Obj1* _tmp0_;
	Iface1* iface1 = NULL;
	Iface1* _tmp1_;
	Iface2* iface2 = NULL;
	Iface2* _tmp2_;
	Iface1* _tmp3_;
	Iface2* _tmp4_;
	Obj2* obj2 = NULL;
	Obj2* _tmp5_;
	Iface1* _tmp6_;
	Iface2* _tmp7_;
	Iface1* _tmp8_;
	Iface2* _tmp9_;
	Concrete* concrete = NULL;
	Concrete* _tmp10_;
	_tmp0_ = obj1_new ();
	obj1 = _tmp0_;
	_tmp1_ = _g_object_ref0 (G_TYPE_CHECK_INSTANCE_CAST (obj1, TYPE_IFACE1, Iface1));
	iface1 = _tmp1_;
	_tmp2_ = _g_object_ref0 (G_TYPE_CHECK_INSTANCE_CAST (obj1, TYPE_IFACE2, Iface2));
	iface2 = _tmp2_;
	_tmp3_ = iface1;
	_vala_assert (iface1_foo (_tmp3_) == 1, "iface1.foo () == 1");
	_tmp4_ = iface2;
	_vala_assert (iface2_foo (_tmp4_) == 2, "iface2.foo () == 2");
	_tmp5_ = obj2_new ();
	obj2 = _tmp5_;
	_tmp6_ = _g_object_ref0 (G_TYPE_CHECK_INSTANCE_CAST (obj2, TYPE_IFACE1, Iface1));
	_g_object_unref0 (iface1);
	iface1 = _tmp6_;
	_tmp7_ = _g_object_ref0 (G_TYPE_CHECK_INSTANCE_CAST (obj2, TYPE_IFACE2, Iface2));
	_g_object_unref0 (iface2);
	iface2 = _tmp7_;
	_tmp8_ = iface1;
	_vala_assert (iface1_foo (_tmp8_) == 1, "iface1.foo () == 1");
	_tmp9_ = iface2;
	_vala_assert (iface2_foo (_tmp9_) == 2, "iface2.foo () == 2");
	_tmp10_ = concrete_new ();
	concrete = _tmp10_;
	_vala_assert (iface_foo (G_TYPE_CHECK_INSTANCE_CAST (concrete, TYPE_IFACE, Iface)) == 42, "((Iface) concrete).foo () == 42");
	_g_object_unref0 (concrete);
	_g_object_unref0 (obj2);
	_g_object_unref0 (iface2);
	_g_object_unref0 (iface1);
	_g_object_unref0 (obj1);
}

int
main (int argc,
      char ** argv)
{
	_vala_main ();
	return 0;
}

