blob: ab5376424f9898ae8c6b1eef9c64f9d88fddcf4a [file] [log] [blame]
/+
REQUIRED_ARGS: -o- -HC
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
class ExternDClass;
struct ExternDStruct2;
struct ExternDStruct3;
struct ExternDStruct final
{
int32_t i;
double d;
ExternDStruct() :
i(),
d()
{
}
ExternDStruct(int32_t i, double d = NAN) :
i(i),
d(d)
{}
};
enum class ExternDEnum
{
A = 0,
};
template <>
struct ExternDStructTemplate final
{
int32_t i;
double d;
ExternDStructTemplate()
{
}
};
class Object
{
virtual void __vtable_slot_0();
virtual void __vtable_slot_1();
virtual void __vtable_slot_2();
virtual void __vtable_slot_3();
public:
class Monitor
{
virtual void __vtable_slot_4();
virtual void __vtable_slot_5();
};
};
class ExternDClass : public Object
{
public:
int32_t i;
double d;
};
struct ExternDStruct2 final
{
int32_t doStuff();
ExternDStruct2()
{
}
};
struct ExternDStruct3 final
{
int32_t a;
ExternDStruct3() :
a()
{
}
ExternDStruct3(int32_t a) :
a(a)
{}
};
namespace ExternDEnum2
{
static ExternDStruct3 const A = ExternDStruct3(1);
};
struct ExternCppStruct final
{
ExternDStruct s;
ExternDEnum e;
ExternDStructTemplate< > st;
ExternCppStruct() :
s(),
st()
{
}
ExternCppStruct(ExternDStruct s, ExternDEnum e = (ExternDEnum)0, ExternDStructTemplate< > st = ExternDStructTemplate< >()) :
s(s),
e(e),
st(st)
{}
};
extern ExternDClass* globalC;
extern void foo(int32_t arg = globalC.i);
extern ExternDStruct2* globalS2;
extern void bar(int32_t arg = globalS2->doStuff());
extern /* ExternDEnum2 */ ExternDStruct3* globalE2;
extern void baz(int32_t arg = globalE2->a);
---
Known issues:
- class declarations must be emitted on member access
+/
// extern(D) symbols are ignored upon first visit but required later
struct ExternDStruct
{
int i;
double d;
// None of these can be emitted due to the mismatched mangling
static double staticDouble;
static shared double staticSharedDouble;
__gshared double sharedDouble;
}
struct ExternDStruct2
{
extern(C++) int doStuff()
{
return 1;
}
}
struct ExternDStruct3
{
int a;
}
class ExternDClass
{
int i;
double d;
}
enum ExternDEnum
{
A
}
enum ExternDEnum2 : ExternDStruct3
{
A = ExternDStruct3(1)
}
struct ExternDStructTemplate()
{
int i;
double d;
}
extern (C++):
struct ExternCppStruct
{
ExternDStruct s;
ExternDEnum e;
ExternDStructTemplate!() st;
}
__gshared ExternDClass globalC;
void foo(int arg = globalC.i) {}
__gshared ExternDStruct2* globalS2;
void bar(int arg = globalS2.doStuff()) {}
__gshared ExternDEnum2* globalE2;
void baz(int arg = globalE2.a) {}