/+
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
{
    int32_t i;
    int32_t get(int32_t , int32_t );
    static int32_t get();
    static const int32_t staticVar;
    void useVars(int32_t pi = i, int32_t psv = staticVar);
    struct Nested final
    {
        void useStaticVar(int32_t i = staticVar);
        Nested()
        {
        }
    };
    S() :
        i()
    {
    }
    S(int32_t i) :
        i(i)
        {}
};
extern "C" int32_t bar(int32_t x);
extern "C" int32_t bar2(int32_t x);
extern "C" int32_t bar4(int32_t x = 42);
extern int32_t baz(int32_t x);
extern int32_t baz2(int32_t x);
extern int32_t baz4(int32_t x = 42);
extern size_t baz5(size_t x = 42);
extern size_t& bazRef(size_t& x);
extern size_t bazOut(size_t& x);
enum class E : int64_t
{
    m = 1LL,
};
enum class MS : uint8_t
{
    dm = 0u,
};
namespace MSN
{
    static S const s = S(42);
};
struct W1 final
{
    MS ms;
    /* MSN */ S msn;
    W1()
    {
    }
    W1(MS ms, /* MSN */ S msn = S(42)) :
        ms(ms),
        msn(msn)
        {}
};
struct W2 final
{
    W1 w1;
    W2() :
        w1()
    {
    }
    W2(W1 w1) :
        w1(w1)
        {}
};
extern W2 w2;
extern void enums(uint64_t e = $?:32=1LLU|64=static_cast<uint64_t>(E::m)$, uint8_t e2 = static_cast<uint8_t>(w2.w1.ms), S s = static_cast<S>(w2.w1.msn));
extern S s;
extern void aggregates(int32_t a = s.i, int32_t b = s.get(1, 2), int32_t c = S::get(), int32_t d = S::staticVar);
struct S2 final
{
    S s;
    struct S3 final
    {
        static int32_t i;
        S3()
        {
        }
    };
    S2() :
        s()
    {
    }
    S2(S s) :
        s(s)
        {}
};
extern S2 s2;
extern void chains(int32_t a = s2.s.i, int32_t b = S2::S3::i);
extern S* ptr;
extern int32_t(*f)(int32_t );
extern void special(int32_t a = ptr->i, int32_t b = ptr->get(1, 2), int32_t j = (*f)(1));
extern void variadic(int32_t _param_0, ...);
---
+/
int foo(int x)
{
    return x * 42;
}
extern (C) int fun();
extern (C++) int fun2();
extern (C) int bar(int x)
{
    return x * 42;
}
extern (C) static int bar2(int x)
{
    return x * 42;
}
extern (C) private int bar3(int x)
{
    return x * 42;
}
extern (C) int bar4(int x = 42)
{
    return x * 42;
}
extern (C++) int baz(int x)
{
    return x * 42;
}
extern (C++) static int baz2(int x)
{
    return x * 42;
}
extern (C++) private int baz3(int x)
{
    return x * 42;
}
extern (C++) int baz4(int x = 42)
{
    return x * 42;
}
extern (C++) size_t baz5(size_t x = 42)
{
    return x * 42;
}
extern (C++) ref size_t bazRef(return ref size_t x)
{
    return x;
}
extern (C++) size_t bazOut(out size_t x)
{
    return x;
}
extern (C++):
enum E : long
{
    m = 1
}
enum MS : ubyte { dm }
enum MSN : S { s = S(42) }
struct W1 { MS ms; MSN msn; }
struct W2 { W1 w1; }
__gshared W2 w2;
void enums(ulong e = E.m, ubyte e2 = w2.w1.ms, S s = w2.w1.msn) {}
struct S
{
    int i;
    int get(int, int);
    static int get();
    __gshared const int staticVar;
    void useVars(int pi = i, int psv = staticVar) {}
    struct Nested
    {
        void useStaticVar(int i = staticVar) {}
    }
}
__gshared S s;
void aggregates(int a = s.i, int b = s.get(1, 2), int c = S.get(), int d = S.staticVar) {}
struct S2
{
    S s;
    static struct S3
    {
        __gshared int i = 3;
    }
}
__gshared S2 s2;
void chains(int a = s2.s.i, int b = S2.S3.i) {}
__gshared S* ptr;
__gshared int function(int) f;
void special(int a = ptr.i, int b = ptr.get(1, 2), int j = f(1)) {}
import core.stdc.stdarg;
void variadic(int, ...) {}