/*
REQUIRED_ARGS: -HC -c -o-
PERMUTE_ARGS:
TEST_OUTPUT:
---
// Automatically generated by Digital Mars D Compiler

#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

struct S final
{
    union
    {
        int32_t x;
        char c[4$?:32=u|64=LLU$];
    };
    struct
    {
        int32_t y;
        double z;
        void bar();
    };
    struct
    {
        int32_t outerPrivate;
    };
    struct
    {
        int32_t innerPrivate;
        int32_t innerBar;
    };
    S() :
        y(),
        z(),
        outerPrivate(),
        innerPrivate(),
        innerBar()
    {
    }
    S(int32_t y, double z = NAN, int32_t outerPrivate = 0, int32_t innerPrivate = 0, int32_t innerBar = 0) :
        y(y),
        z(z),
        outerPrivate(outerPrivate),
        innerPrivate(innerPrivate),
        innerBar(innerBar)
        {}
};

extern void foo();
---
*/

extern (C++) struct S
{
    union
    {
        int x;
        char[4] c;
    }

    struct
    {
        int y;
        double z;
        extern(C) void foo() {}
        extern(C++) void bar() {}
    }

    // Private not emitted because AnonDeclaration has no protection
    private struct
    {
        int outerPrivate;
    }

    public struct {
        // Private cannot be exported to C++
        private int innerPrivate;
        int innerBar;
    }
}

extern (D)
{
    extern(C++) void foo() {}
}
