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

#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 gint (*FooFunc) (gpointer user_data);
typedef struct _Block1Data Block1Data;
#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 _Block1Data {
	int _ref_count_;
	gint i;
};

VALA_EXTERN void foo (gint i,
          FooFunc* func,
          gpointer* func_target,
          GDestroyNotify* func_target_destroy_notify);
static gint __lambda4_ (void);
static gint ___lambda4__foo_func (gpointer self);
VALA_EXTERN gint bar (void);
static void _vala_main (void);
static gint _bar_foo_func (gpointer self);
static Block1Data* block1_data_ref (Block1Data* _data1_);
static void block1_data_unref (void * _userdata_);
static gint ___lambda5_ (Block1Data* _data1_);
static gint ____lambda5__foo_func (gpointer self);

static gint
__lambda4_ (void)
{
	gint result;
	result = 4711;
	return result;
}

static gint
___lambda4__foo_func (gpointer self)
{
	gint result;
	result = __lambda4_ ();
	return result;
}

void
foo (gint i,
     FooFunc* func,
     gpointer* func_target,
     GDestroyNotify* func_target_destroy_notify)
{
	_vala_assert ((*func) (*func_target) == i, "func () == i");
	((*func_target_destroy_notify) == NULL) ? NULL : ((*func_target_destroy_notify) (*func_target), NULL);
	*func = NULL;
	*func_target = NULL;
	*func_target_destroy_notify = NULL;
	*func = ___lambda4__foo_func;
	*func_target = NULL;
	*func_target_destroy_notify = NULL;
}

gint
bar (void)
{
	gint result;
	result = 23;
	return result;
}

static gint
_bar_foo_func (gpointer self)
{
	gint result;
	result = bar ();
	return result;
}

static Block1Data*
block1_data_ref (Block1Data* _data1_)
{
	g_atomic_int_inc (&_data1_->_ref_count_);
	return _data1_;
}

static void
block1_data_unref (void * _userdata_)
{
	Block1Data* _data1_;
	_data1_ = (Block1Data*) _userdata_;
	if (g_atomic_int_dec_and_test (&_data1_->_ref_count_)) {
		g_slice_free (Block1Data, _data1_);
	}
}

static gint
___lambda5_ (Block1Data* _data1_)
{
	gint result;
	result = _data1_->i;
	return result;
}

static gint
____lambda5__foo_func (gpointer self)
{
	gint result;
	result = ___lambda5_ (self);
	return result;
}

static void
_vala_main (void)
{
	{
		FooFunc func = NULL;
		gpointer func_target;
		GDestroyNotify func_target_destroy_notify;
		FooFunc _tmp0_;
		gpointer _tmp0__target;
		FooFunc _tmp1_;
		gpointer _tmp1__target;
		func = _bar_foo_func;
		func_target = NULL;
		func_target_destroy_notify = NULL;
		_tmp0_ = func;
		_tmp0__target = func_target;
		_vala_assert (_tmp0_ (_tmp0__target) == 23, "func () == 23");
		foo (23, &func, &func_target, &func_target_destroy_notify);
		_tmp1_ = func;
		_tmp1__target = func_target;
		_vala_assert (_tmp1_ (_tmp1__target) == 4711, "func () == 4711");
		(func_target_destroy_notify == NULL) ? NULL : (func_target_destroy_notify (func_target), NULL);
		func = NULL;
		func_target = NULL;
		func_target_destroy_notify = NULL;
	}
	{
		Block1Data* _data1_;
		FooFunc func = NULL;
		gpointer func_target;
		GDestroyNotify func_target_destroy_notify;
		FooFunc _tmp2_;
		gpointer _tmp2__target;
		FooFunc _tmp3_;
		gpointer _tmp3__target;
		_data1_ = g_slice_new0 (Block1Data);
		_data1_->_ref_count_ = 1;
		_data1_->i = 42;
		func = ____lambda5__foo_func;
		func_target = block1_data_ref (_data1_);
		func_target_destroy_notify = block1_data_unref;
		_tmp2_ = func;
		_tmp2__target = func_target;
		_vala_assert (_tmp2_ (_tmp2__target) == 42, "func () == 42");
		foo (42, &func, &func_target, &func_target_destroy_notify);
		_tmp3_ = func;
		_tmp3__target = func_target;
		_vala_assert (_tmp3_ (_tmp3__target) == 4711, "func () == 4711");
		(func_target_destroy_notify == NULL) ? NULL : (func_target_destroy_notify (func_target), NULL);
		func = NULL;
		func_target = NULL;
		func_target_destroy_notify = NULL;
		block1_data_unref (_data1_);
		_data1_ = NULL;
	}
}

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

