/* structs_bug685177.c generated by valac, the Vala compiler
 * generated from structs_bug685177.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 __vala_GValue_free0(var) ((var == NULL) ? NULL : (var = (_vala_GValue_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);

VALA_EXTERN void non_nullable (GValue* v1,
                   GValue* v2,
                   GValue* v3);
VALA_EXTERN void nullable (GValue* v1,
               GValue** v2,
               GValue** v3);
static GValue* _g_value_dup (GValue* self);
static void _vala_GValue_free (GValue* self);
static void _vala_main (void);

void
non_nullable (GValue* v1,
              GValue* v2,
              GValue* v3)
{
	GValue _vala_v3 = {0};
	GValue _tmp0_;
	GValue _tmp1_;
	GValue _tmp2_ = {0};
	GValue _tmp3_;
	GValue _tmp4_;
	GValue _tmp5_ = {0};
	g_return_if_fail (v1 != NULL);
	g_return_if_fail (v2 != NULL);
	_tmp0_ = *v2;
	_tmp1_ = _tmp0_;
	if (G_IS_VALUE (&_tmp1_)) {
		g_value_init (&_tmp2_, G_VALUE_TYPE (&_tmp1_));
		g_value_copy (&_tmp1_, &_tmp2_);
	} else {
		_tmp2_ = _tmp1_;
	}
	G_IS_VALUE (&_vala_v3) ? (g_value_unset (&_vala_v3), NULL) : NULL;
	_vala_v3 = _tmp2_;
	_tmp3_ = *v1;
	_tmp4_ = _tmp3_;
	if (G_IS_VALUE (&_tmp4_)) {
		g_value_init (&_tmp5_, G_VALUE_TYPE (&_tmp4_));
		g_value_copy (&_tmp4_, &_tmp5_);
	} else {
		_tmp5_ = _tmp4_;
	}
	G_IS_VALUE (v2) ? (g_value_unset (v2), NULL) : NULL;
	*v2 = _tmp5_;
	if (v3) {
		*v3 = _vala_v3;
	} else {
		G_IS_VALUE (&_vala_v3) ? (g_value_unset (&_vala_v3), NULL) : NULL;
	}
}

static GValue*
_g_value_dup (GValue* self)
{
	return g_boxed_copy (G_TYPE_VALUE, self);
}

static gpointer
__g_value_dup0 (gpointer self)
{
	return self ? _g_value_dup (self) : NULL;
}

static void
_vala_GValue_free (GValue* self)
{
	g_boxed_free (G_TYPE_VALUE, self);
}

void
nullable (GValue* v1,
          GValue** v2,
          GValue** v3)
{
	GValue* _vala_v3 = NULL;
	GValue* _tmp0_;
	_tmp0_ = __g_value_dup0 (*v2);
	__vala_GValue_free0 (_vala_v3);
	_vala_v3 = _tmp0_;
	__vala_GValue_free0 (*v2);
	*v2 = NULL;
	if (v3) {
		*v3 = _vala_v3;
	} else {
		__vala_GValue_free0 (_vala_v3);
	}
}

static void
_vala_main (void)
{
	GValue v1 = {0};
	GValue _tmp0_ = {0};
	GValue v2 = {0};
	GValue _tmp1_ = {0};
	GValue v3 = {0};
	GValue _tmp2_;
	GValue _tmp3_ = {0};
	GValue _tmp4_;
	GValue _tmp5_;
	GValue _tmp6_;
	GValue* v4 = NULL;
	GValue* _tmp7_ = NULL;
	GValue* v5 = NULL;
	GValue* _tmp8_ = NULL;
	GValue* v6 = NULL;
	GValue* _tmp9_ = NULL;
	GValue* _tmp10_;
	GValue _tmp11_;
	GValue _tmp12_ = {0};
	GValue _tmp13_;
	GValue _tmp14_;
	GValue* _tmp15_;
	GValue* _tmp16_;
	GValue* _tmp17_;
	GValue* _tmp18_;
	GValue* _tmp19_ = NULL;
	GValue* _tmp20_ = NULL;
	GValue* _tmp21_ = NULL;
	GValue* _tmp22_;
	GValue* _tmp23_ = NULL;
	GValue* _tmp24_;
	GValue* _tmp25_;
	GValue* _tmp26_;
	g_value_init (&_tmp0_, G_TYPE_INT);
	g_value_set_int (&_tmp0_, 1);
	v1 = _tmp0_;
	g_value_init (&_tmp1_, G_TYPE_INT);
	g_value_set_int (&_tmp1_, 2);
	v2 = _tmp1_;
	_tmp2_ = v1;
	non_nullable (&_tmp2_, &v2, &_tmp3_);
	G_IS_VALUE (&v3) ? (g_value_unset (&v3), NULL) : NULL;
	v3 = _tmp3_;
	_tmp4_ = v1;
	_vala_assert (g_value_get_int (&_tmp4_) == 1, "(int)v1 == 1");
	_tmp5_ = v2;
	_vala_assert (g_value_get_int (&_tmp5_) == 1, "(int)v2 == 1");
	_tmp6_ = v3;
	_vala_assert (g_value_get_int (&_tmp6_) == 2, "(int)v3 == 2");
	_tmp7_ = g_new0 (GValue, 1);
	g_value_init (_tmp7_, G_TYPE_INT);
	g_value_set_int (_tmp7_, 4);
	v4 = _tmp7_;
	_tmp8_ = g_new0 (GValue, 1);
	g_value_init (_tmp8_, G_TYPE_INT);
	g_value_set_int (_tmp8_, 5);
	v5 = _tmp8_;
	_tmp9_ = g_new0 (GValue, 1);
	g_value_init (_tmp9_, G_TYPE_INT);
	g_value_set_int (_tmp9_, 6);
	v6 = _tmp9_;
	_tmp10_ = v4;
	_tmp11_ = *_tmp10_;
	non_nullable (&_tmp11_, v5, &_tmp12_);
	__vala_GValue_free0 (v6);
	_tmp13_ = _tmp12_;
	_tmp14_ = _tmp13_;
	_tmp15_ = __g_value_dup0 (&_tmp14_);
	v6 = _tmp15_;
	G_IS_VALUE (&_tmp13_) ? (g_value_unset (&_tmp13_), NULL) : NULL;
	_tmp16_ = v4;
	_vala_assert (g_value_get_int (_tmp16_) == 4, "(int)v4 == 4");
	_tmp17_ = v5;
	_vala_assert (g_value_get_int (_tmp17_) == 4, "(int)v5 == 4");
	_tmp18_ = v6;
	_vala_assert (g_value_get_int (_tmp18_) == 5, "(int)v6 == 5");
	_tmp19_ = g_new0 (GValue, 1);
	g_value_init (_tmp19_, G_TYPE_INT);
	g_value_set_int (_tmp19_, 4);
	__vala_GValue_free0 (v4);
	v4 = _tmp19_;
	_tmp20_ = g_new0 (GValue, 1);
	g_value_init (_tmp20_, G_TYPE_INT);
	g_value_set_int (_tmp20_, 5);
	__vala_GValue_free0 (v5);
	v5 = _tmp20_;
	_tmp21_ = g_new0 (GValue, 1);
	g_value_init (_tmp21_, G_TYPE_INT);
	g_value_set_int (_tmp21_, 6);
	__vala_GValue_free0 (v6);
	v6 = _tmp21_;
	_tmp22_ = v4;
	nullable (_tmp22_, &v5, &_tmp23_);
	__vala_GValue_free0 (v6);
	v6 = _tmp23_;
	_tmp24_ = v4;
	_vala_assert (g_value_get_int (_tmp24_) == 4, "(int)v4 == 4");
	_tmp25_ = v5;
	_vala_assert (((gpointer) _tmp25_) == NULL, "v5 == null");
	_tmp26_ = v6;
	_vala_assert (g_value_get_int (_tmp26_) == 5, "(int)v6 == 5");
	__vala_GValue_free0 (v6);
	__vala_GValue_free0 (v5);
	__vala_GValue_free0 (v4);
	G_IS_VALUE (&v3) ? (g_value_unset (&v3), NULL) : NULL;
	G_IS_VALUE (&v2) ? (g_value_unset (&v2), NULL) : NULL;
	G_IS_VALUE (&v1) ? (g_value_unset (&v1), NULL) : NULL;
}

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

