// Note: suppress -Wincompatible-function-pointer-types because cgo exports may have
// signatures that C strictly typechecks. The function pointers are ABI-compatible.
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wincompatible-function-pointer-types"
// C inline function to construct the {{ c_vtable_struct }} vtable.
// This allows direct assignment of function pointers with proper casting.
static inline {{ c_vtable_struct }}* {{ vtable_constructor }}(void) {
	// Note: All function pointers are assigned with generic casts to suppress warnings.
	// The actual function addresses are ABI-compatible despite signature differences.
	{{ c_vtable_struct }}* vtable = ({{ c_vtable_struct }}*)malloc(sizeof({{ c_vtable_struct }}));
	if (!vtable) return NULL;
	memset(vtable, 0, sizeof({{ c_vtable_struct }}));

{%- for field_name in method_field_names %}
	vtable->{{ field_name }} = (void(*)(void))go{{ trait_pascal }}{{ method_pascal_names[loop.index0] }};
{%- endfor %}
	vtable->free_string = (void(*)(void))go{{ trait_pascal }}FreeString;
	vtable->free_user_data = (void(*)(void))go{{ trait_pascal }}FreeUserData;
	vtable->name_fn = (void(*)(void))go{{ trait_pascal }}Name;
	vtable->version_fn = (void(*)(void))go{{ trait_pascal }}Version;
	vtable->initialize_fn = (void(*)(void))go{{ trait_pascal }}Initialize;
	vtable->shutdown_fn = (void(*)(void))go{{ trait_pascal }}Shutdown;

	return vtable;
}
#pragma GCC diagnostic pop
