/++
REQUIRED_ARGS: -HC=verbose -c -o- -d
PERMUTE_ARGS:
TEST_OUTPUT:
---
// Automatically generated by Digital Mars D Compiler v$n$

#pragma once

#include <assert.h>
#include <math.h>
#include <stddef.h>
#include <stdint.h>

#ifdef CUSTOM_D_ARRAY_TYPE
#define _d_dynamicArray CUSTOM_D_ARRAY_TYPE
#else
/// Represents a D [] array
template<typename T>
struct _d_dynamicArray final
{
    size_t length;
    T *ptr;

    _d_dynamicArray() : length(0), ptr(NULL) { }

    _d_dynamicArray(size_t length_in, T *ptr_in)
        : length(length_in), ptr(ptr_in) { }

    T& operator[](const size_t idx) {
        assert(idx < length);
        return ptr[idx];
    }

    const T& operator[](const size_t idx) const {
        assert(idx < length);
        return ptr[idx];
    }
};
#endif
#if !defined(_d_real)
#define _d_real long double
#endif

class WithImaginary
{
public:
    float memberIf;
    double memberId;
    _d_real memberIr;
    _Complex float memberCf;
    _Complex double memberCd;
    _Complex _d_real memberCr;
    _d_dynamicArray< float > nested;
    // Ignored function dtoh_ignored.WithImaginary.onReturn because its return type cannot be mapped to C++
private:
    virtual void __vtable_slot_0();
    // Ignored function dtoh_ignored.WithImaginary.onParam because one of its parameters has type `ifloat` which cannot be mapped to C++
    virtual void __vtable_slot_1();
};

template <typename T>
struct WithImaginaryTemplate final
{
    float member;
    // Ignored function onReturn because its return type cannot be mapped to C++
    // Ignored function onParam because one of its parameters has type `ifloat` which cannot be mapped to C++
    // Ignored variable onVariable because its type cannot be mapped to C++
    WithImaginaryTemplate()
    {
    }
};

extern WithImaginaryTemplate<int32_t > instance;

// Ignored variable dtoh_ignored.onVariable because its type cannot be mapped to C++
// Ignored variable dtoh_ignored.onVariablePointer because its type cannot be mapped to C++
// Ignored variable dtoh_ignored.onVariableSlice because its type cannot be mapped to C++
// Ignored variable dtoh_ignored.onVariableArray because its type cannot be mapped to C++
extern void* onVariableAssocArray;

// Ignored variable dtoh_ignored.onVariableFunction because its type cannot be mapped to C++
// Ignored variable dtoh_ignored.onVariableFunctionParam because its type cannot be mapped to C++
// Ignored variable dtoh_ignored.onVariableDelegate because its type cannot be mapped to C++
// Ignored function dtoh_ignored.myExit because its return type cannot be mapped to C++
---
+/

extern (C++):

class WithImaginary
{
    ifloat memberIf;
	idouble memberId;
	ireal memberIr;

	cfloat memberCf;
	cdouble memberCd;
	creal memberCr;

    ifloat[] nested;

    ifloat onReturn()
    {
        return 0i;
    }

    void onParam(ifloat) {}
}

struct WithImaginaryTemplate(T)
{
    ifloat member;

    ifloat onReturn()
    {
        return 0i;
    }

    void onParam(ifloat)
    {
    }

    __gshared ifloat onVariable;
}

__gshared WithImaginaryTemplate!int instance;

__gshared ifloat onVariable;

__gshared ifloat** onVariablePointer;

__gshared ifloat[] onVariableSlice;

__gshared ifloat[2] onVariableArray;

__gshared ifloat[int] onVariableAssocArray;

__gshared ifloat function() onVariableFunction;

__gshared void function(ifloat) onVariableFunctionParam;

__gshared ifloat delegate() onVariableDelegate;

noreturn myExit()
{
    assert(false);
}
