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

#include <glib-object.h>
#include <glib.h>
#include <stdlib.h>
#include <string.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 _g_free0(var) (var = (g_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 gpointer manam (GType t_type,
                GBoxedCopyFunc t_dup_func,
                GDestroyNotify t_destroy_func,
                gconstpointer foo);
VALA_EXTERN gboolean get_bool (void);
VALA_EXTERN gpointer minim_b (GType t_type,
                  GBoxedCopyFunc t_dup_func,
                  GDestroyNotify t_destroy_func);
VALA_EXTERN guint32 get_uint32 (void);
VALA_EXTERN gpointer minim_u (GType t_type,
                  GBoxedCopyFunc t_dup_func,
                  GDestroyNotify t_destroy_func);
VALA_EXTERN gchar* get_string (void);
VALA_EXTERN gpointer minim_s (GType t_type,
                  GBoxedCopyFunc t_dup_func,
                  GDestroyNotify t_destroy_func);
static void _vala_main (void);

gpointer
manam (GType t_type,
       GBoxedCopyFunc t_dup_func,
       GDestroyNotify t_destroy_func,
       gconstpointer foo)
{
	gpointer _tmp0_;
	gpointer result;
	_tmp0_ = ((foo != NULL) && (t_dup_func != NULL)) ? t_dup_func ((gpointer) foo) : ((gpointer) foo);
	result = _tmp0_;
	return result;
}

gboolean
get_bool (void)
{
	gboolean result;
	result = TRUE;
	return result;
}

gpointer
minim_b (GType t_type,
         GBoxedCopyFunc t_dup_func,
         GDestroyNotify t_destroy_func)
{
	gpointer _tmp0_;
	gpointer result;
	_tmp0_ = manam (t_type, (GBoxedCopyFunc) t_dup_func, (GDestroyNotify) t_destroy_func, (gpointer) ((gintptr) get_bool ()));
	result = _tmp0_;
	return result;
}

guint32
get_uint32 (void)
{
	guint32 result;
	result = (guint32) 23U;
	return result;
}

gpointer
minim_u (GType t_type,
         GBoxedCopyFunc t_dup_func,
         GDestroyNotify t_destroy_func)
{
	gpointer _tmp0_;
	gpointer result;
	_tmp0_ = manam (t_type, (GBoxedCopyFunc) t_dup_func, (GDestroyNotify) t_destroy_func, (gpointer) ((guintptr) get_uint32 ()));
	result = _tmp0_;
	return result;
}

gchar*
get_string (void)
{
	gchar* _tmp0_;
	gchar* result;
	_tmp0_ = g_strdup ("bar");
	result = _tmp0_;
	return result;
}

gpointer
minim_s (GType t_type,
         GBoxedCopyFunc t_dup_func,
         GDestroyNotify t_destroy_func)
{
	gchar* _tmp0_;
	gchar* _tmp1_;
	gpointer _tmp2_;
	gpointer _tmp3_;
	gpointer result;
	_tmp0_ = get_string ();
	_tmp1_ = _tmp0_;
	_tmp2_ = manam (t_type, (GBoxedCopyFunc) t_dup_func, (GDestroyNotify) t_destroy_func, _tmp1_);
	_tmp3_ = _tmp2_;
	_g_free0 (_tmp1_);
	result = _tmp3_;
	return result;
}

static void
_vala_main (void)
{
	{
		gpointer _tmp0_;
		gpointer _tmp1_;
		_tmp0_ = manam (G_TYPE_BOOLEAN, NULL, NULL, (gpointer) ((gintptr) get_bool ()));
		_vala_assert (((gboolean) ((gintptr) _tmp0_)) == TRUE, "manam<bool> (get_bool ()) == true");
		_tmp1_ = minim_b (G_TYPE_BOOLEAN, NULL, NULL);
		_vala_assert (((gboolean) ((gintptr) _tmp1_)) == TRUE, "minim_b<bool> () == true");
	}
	{
		gpointer _tmp2_;
		gpointer _tmp3_;
		_tmp2_ = manam (G_TYPE_UINT, NULL, NULL, (gpointer) ((guintptr) get_uint32 ()));
		_vala_assert (((guint32) ((guintptr) _tmp2_)) == ((guint32) 23U), "manam<uint32> (get_uint32 ()) == 23U");
		_tmp3_ = minim_u (G_TYPE_UINT, NULL, NULL);
		_vala_assert (((guint32) ((guintptr) _tmp3_)) == ((guint32) 23U), "minim_u<uint32> () == 23U");
	}
	{
		gchar* _tmp4_;
		gchar* _tmp5_;
		gpointer _tmp6_;
		gchar* _tmp7_;
		gpointer _tmp8_;
		gchar* _tmp9_;
		_tmp4_ = get_string ();
		_tmp5_ = _tmp4_;
		_tmp6_ = manam (G_TYPE_STRING, (GBoxedCopyFunc) g_strdup, (GDestroyNotify) g_free, _tmp5_);
		_tmp7_ = (gchar*) _tmp6_;
		_vala_assert (g_strcmp0 (_tmp7_, "bar") == 0, "manam<string> (get_string ()) == \"bar\"");
		_g_free0 (_tmp7_);
		_g_free0 (_tmp5_);
		_tmp8_ = minim_s (G_TYPE_STRING, (GBoxedCopyFunc) g_strdup, (GDestroyNotify) g_free);
		_tmp9_ = (gchar*) _tmp8_;
		_vala_assert (g_strcmp0 (_tmp9_, "bar") == 0, "minim_s<string> () == \"bar\"");
		_g_free0 (_tmp9_);
	}
}

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

