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

#include <stdlib.h>
#include <string.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

typedef struct _AbstractFoo AbstractFoo;
typedef AbstractFoo Foo;
typedef Foo Bar;
typedef struct _Manam Manam;
typedef Manam Baz;
#define _manam_free0(var) ((var == NULL) ? NULL : (var = (manam_free (var), NULL)))
#define _abstract_foo_free0(var) ((var == NULL) ? NULL : (var = (abstract_foo_free (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 _AbstractFoo {
	const gchar* (*foo) (AbstractFoo* self);
	gint (*get_prop) (AbstractFoo* self);
	void (*set_prop) (AbstractFoo* self, gint value);
	gint field;
};

struct _Manam {
	const gchar* (*foo) (Manam* self);
	gint (*foo_plain) (Manam* self);
	gint (*get_prop) (Manam* self);
	void (*set_prop) (Manam* self, gint value);
	gint field;
};

VALA_EXTERN void abstract_foo_free (AbstractFoo * self);
G_DEFINE_AUTOPTR_CLEANUP_FUNC (AbstractFoo, abstract_foo_free)
static void abstract_foo_instance_init (AbstractFoo * self);
VALA_EXTERN const gchar* abstract_foo_foo (AbstractFoo* self);
static const gchar* abstract_foo_real_foo (AbstractFoo* self);
VALA_EXTERN AbstractFoo* abstract_foo_new (void);
VALA_EXTERN gint abstract_foo_get_prop (AbstractFoo* self);
VALA_EXTERN void abstract_foo_set_prop (AbstractFoo* self,
                            gint value);
G_DEFINE_AUTOPTR_CLEANUP_FUNC (Foo, abstract_foo_free)
static void foo_instance_init (Foo * self);
VALA_EXTERN Foo* foo_new (void);
static const gchar* foo_real_foo (AbstractFoo* base);
G_DEFINE_AUTOPTR_CLEANUP_FUNC (Bar, abstract_foo_free)
static void bar_instance_init (Bar * self);
VALA_EXTERN Bar* bar_new (void);
static const gchar* bar_real_foo (AbstractFoo* base);
VALA_EXTERN void manam_free (Manam * self);
G_DEFINE_AUTOPTR_CLEANUP_FUNC (Manam, manam_free)
static void manam_instance_init (Manam * self);
VALA_EXTERN const gchar* manam_foo (Manam* self);
VALA_EXTERN gint manam_get_prop (Manam* self);
VALA_EXTERN void manam_set_prop (Manam* self,
                     gint value);
static const gchar* manam_real_foo (Manam* self);
static gint manam_real_foo_plain (Manam* self);
VALA_EXTERN Manam* manam_new (void);
G_DEFINE_AUTOPTR_CLEANUP_FUNC (Baz, manam_free)
static void baz_instance_init (Baz * self);
static const gchar* baz_real_foo (Manam* base);
static gint baz_real_foo_plain (Manam* base);
VALA_EXTERN Baz* baz_new (void);
static void _vala_main (void);

static const gchar*
abstract_foo_real_foo (AbstractFoo* self)
{
	g_critical ("Abstract method `abstract_foo_foo' is not implemented");
	return NULL;
}

const gchar*
abstract_foo_foo (AbstractFoo* self)
{
	g_return_val_if_fail (self != NULL, NULL);
	if (self->foo) {
		return self->foo (self);
	}
	return NULL;
}

AbstractFoo*
abstract_foo_new (void)
{
	AbstractFoo* self;
	self = g_slice_new0 (AbstractFoo);
	abstract_foo_instance_init (self);
	return self;
}

gint
abstract_foo_get_prop (AbstractFoo* self)
{
	g_return_val_if_fail (self != NULL, 0);
	if (self->get_prop) {
		return self->get_prop (self);
	}
	return -1;
}

void
abstract_foo_set_prop (AbstractFoo* self,
                       gint value)
{
	g_return_if_fail (self != NULL);
	if (self->set_prop) {
		self->set_prop (self, value);
	}
}

static void
abstract_foo_instance_init (AbstractFoo * self)
{
	((AbstractFoo *) self)->foo = (const gchar* (*) (AbstractFoo*)) abstract_foo_real_foo;
	self->field = 23;
}

void
abstract_foo_free (AbstractFoo * self)
{
	g_slice_free (AbstractFoo, self);
}

Foo*
foo_new (void)
{
	Foo* self;
	gint _tmp0_;
	gint _tmp1_;
	self = (Foo*) abstract_foo_new ();
	foo_instance_init (self);
	_vala_assert (((AbstractFoo*) self)->field == 23, "field == 23");
	((AbstractFoo*) self)->field = 37;
	_tmp0_ = abstract_foo_get_prop ((AbstractFoo*) self);
	_tmp1_ = _tmp0_;
	_vala_assert (_tmp1_ == 38, "prop == 38");
	return self;
}

static const gchar*
foo_real_foo (AbstractFoo* base)
{
	Foo * self;
	const gchar* result;
	self = (Foo*) base;
	result = "Foo";
	return result;
}

static gint
foo_real_get_prop (AbstractFoo* base)
{
	gint result;
	Foo* self;
	self = (Foo*) base;
	result = ((AbstractFoo*) self)->field + 1;
	return result;
}

static void
foo_real_set_prop (AbstractFoo* base,
                   gint value)
{
	Foo* self;
	self = (Foo*) base;
	((AbstractFoo*) self)->field = value - 1;
}

static void
foo_instance_init (Foo * self)
{
	((AbstractFoo *) self)->foo = (const gchar* (*) (AbstractFoo*)) foo_real_foo;
	((AbstractFoo *) self)->get_prop = (gint (*) (AbstractFoo*)) foo_real_get_prop;
	((AbstractFoo *) self)->set_prop = (void (*) (AbstractFoo*, gint)) foo_real_set_prop;
}

Bar*
bar_new (void)
{
	Bar* self;
	gint _tmp0_;
	gint _tmp1_;
	self = (Bar*) foo_new ();
	bar_instance_init (self);
	_vala_assert (((AbstractFoo*) self)->field == 37, "field == 37");
	((AbstractFoo*) self)->field = 42;
	_tmp0_ = abstract_foo_get_prop ((AbstractFoo*) self);
	_tmp1_ = _tmp0_;
	_vala_assert (_tmp1_ == 84, "prop == 84");
	return self;
}

static const gchar*
bar_real_foo (AbstractFoo* base)
{
	Bar * self;
	const gchar* result;
	self = (Bar*) base;
	result = "Bar";
	return result;
}

static gint
bar_real_get_prop (AbstractFoo* base)
{
	gint result;
	Bar* self;
	self = (Bar*) base;
	result = ((AbstractFoo*) self)->field * 2;
	return result;
}

static void
bar_real_set_prop (AbstractFoo* base,
                   gint value)
{
	Bar* self;
	self = (Bar*) base;
	((AbstractFoo*) self)->field = value / 2;
}

static void
bar_instance_init (Bar * self)
{
	((AbstractFoo *) self)->foo = (const gchar* (*) (AbstractFoo*)) bar_real_foo;
	((AbstractFoo *) self)->get_prop = (gint (*) (AbstractFoo*)) bar_real_get_prop;
	((AbstractFoo *) self)->set_prop = (void (*) (AbstractFoo*, gint)) bar_real_set_prop;
}

static const gchar*
manam_real_foo (Manam* self)
{
	const gchar* result;
	result = "Manam";
	return result;
}

const gchar*
manam_foo (Manam* self)
{
	g_return_val_if_fail (self != NULL, NULL);
	if (self->foo) {
		return self->foo (self);
	}
	return NULL;
}

static gint
manam_real_foo_plain (Manam* self)
{
	gint result;
	result = 13;
	return result;
}

Manam*
manam_new (void)
{
	Manam* self;
	self = g_slice_new0 (Manam);
	manam_instance_init (self);
	return self;
}

gint
manam_get_prop (Manam* self)
{
	g_return_val_if_fail (self != NULL, 0);
	if (self->get_prop) {
		return self->get_prop (self);
	}
	return -1;
}

static gint
manam_real_get_prop (Manam* base)
{
	gint result;
	Manam* self;
	self = base;
	result = self->field + 1;
	return result;
}

void
manam_set_prop (Manam* self,
                gint value)
{
	g_return_if_fail (self != NULL);
	if (self->set_prop) {
		self->set_prop (self, value);
	}
}

static void
manam_real_set_prop (Manam* base,
                     gint value)
{
	Manam* self;
	self = base;
	self->field = value - 1;
}

static void
manam_instance_init (Manam * self)
{
	((Manam *) self)->foo = (const gchar* (*) (Manam*)) manam_real_foo;
	((Manam *) self)->foo_plain = (gint (*) (Manam*)) manam_real_foo_plain;
	((Manam *) self)->get_prop = (gint (*) (Manam*)) manam_real_get_prop;
	((Manam *) self)->set_prop = (void (*) (Manam*, gint)) manam_real_set_prop;
	self->field = 23;
}

void
manam_free (Manam * self)
{
	g_slice_free (Manam, self);
}

static const gchar*
baz_real_foo (Manam* base)
{
	Baz * self;
	const gchar* result;
	self = (Baz*) base;
	result = "Baz";
	return result;
}

static gint
baz_real_foo_plain (Manam* base)
{
	Baz * self;
	gint result;
	self = (Baz*) base;
	result = 23;
	return result;
}

Baz*
baz_new (void)
{
	Baz* self;
	self = (Baz*) manam_new ();
	baz_instance_init (self);
	return self;
}

static void
baz_instance_init (Baz * self)
{
	((Manam *) self)->foo = (const gchar* (*) (Manam*)) baz_real_foo;
	((Manam *) self)->foo_plain = (gint (*) (Manam*)) baz_real_foo_plain;
}

static void
_vala_main (void)
{
	Foo* foo = NULL;
	Foo* _tmp0_;
	const gchar* _tmp1_;
	gint _tmp2_;
	gint _tmp3_;
	Bar* bar = NULL;
	Bar* _tmp4_;
	const gchar* _tmp5_;
	gint _tmp6_;
	gint _tmp7_;
	Manam* manam = NULL;
	Manam* _tmp8_;
	const gchar* _tmp9_;
	gint _tmp10_;
	gint _tmp11_;
	Baz* baz = NULL;
	Baz* _tmp12_;
	const gchar* _tmp13_;
	gint _tmp14_;
	gint _tmp15_;
	_tmp0_ = foo_new ();
	foo = _tmp0_;
	_tmp1_ = abstract_foo_foo ((AbstractFoo*) foo);
	_vala_assert (g_strcmp0 (_tmp1_, "Foo") == 0, "foo.foo () == \"Foo\"");
	_tmp2_ = abstract_foo_get_prop ((AbstractFoo*) foo);
	_tmp3_ = _tmp2_;
	_vala_assert (_tmp3_ == 38, "foo.prop == 38");
	abstract_foo_set_prop ((AbstractFoo*) foo, 4711);
	_vala_assert (((AbstractFoo*) foo)->field == 4710, "foo.field == 4710");
	_tmp4_ = bar_new ();
	bar = _tmp4_;
	_tmp5_ = abstract_foo_foo ((AbstractFoo*) bar);
	_vala_assert (g_strcmp0 (_tmp5_, "Bar") == 0, "bar.foo () == \"Bar\"");
	_tmp6_ = abstract_foo_get_prop ((AbstractFoo*) bar);
	_tmp7_ = _tmp6_;
	_vala_assert (_tmp7_ == 84, "bar.prop == 84");
	abstract_foo_set_prop ((AbstractFoo*) bar, 32);
	_vala_assert (((AbstractFoo*) bar)->field == 16, "bar.field == 16");
	_tmp8_ = manam_new ();
	manam = _tmp8_;
	_tmp9_ = manam_foo (manam);
	_vala_assert (g_strcmp0 (_tmp9_, "Manam") == 0, "manam.foo () == \"Manam\"");
	_tmp10_ = manam_get_prop (manam);
	_tmp11_ = _tmp10_;
	_vala_assert (_tmp11_ == 24, "manam.prop == 24");
	_vala_assert (manam->foo_plain (manam) == 13, "manam.foo_plain () == 13");
	_tmp12_ = baz_new ();
	baz = _tmp12_;
	_tmp13_ = manam_foo ((Manam*) baz);
	_vala_assert (g_strcmp0 (_tmp13_, "Baz") == 0, "baz.foo () == \"Baz\"");
	manam_set_prop ((Manam*) baz, 42);
	_tmp14_ = manam_get_prop ((Manam*) baz);
	_tmp15_ = _tmp14_;
	_vala_assert (_tmp15_ == 42, "baz.prop == 42");
	_vala_assert (((Manam*) baz)->foo_plain ((Manam*) baz) == 23, "baz.foo_plain () == 23");
	_manam_free0 (baz);
	_manam_free0 (manam);
	_abstract_foo_free0 (bar);
	_abstract_foo_free0 (foo);
}

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

