| /+ |
| 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) {} |