d: Merge upstream dmd 568496d5b, druntime 178c44ff, phobos 574bf883b.
[official-gcc.git] / gcc / testsuite / gdc.test / compilable / dtoh_required_symbols.d
blob6e2d2f1e38c55352117ec888908a576f206c0f99
1 /+
2 REQUIRED_ARGS: -o- -HC
3 TEST_OUTPUT:
4 ---
5 // Automatically generated by Digital Mars D Compiler
7 #pragma once
9 #include <assert.h>
10 #include <stddef.h>
11 #include <stdint.h>
12 #include <math.h>
14 #ifdef CUSTOM_D_ARRAY_TYPE
15 #define _d_dynamicArray CUSTOM_D_ARRAY_TYPE
16 #else
17 /// Represents a D [] array
18 template<typename T>
19 struct _d_dynamicArray final
21 size_t length;
22 T *ptr;
24 _d_dynamicArray() : length(0), ptr(NULL) { }
26 _d_dynamicArray(size_t length_in, T *ptr_in)
27 : length(length_in), ptr(ptr_in) { }
29 T& operator[](const size_t idx) {
30 assert(idx < length);
31 return ptr[idx];
34 const T& operator[](const size_t idx) const {
35 assert(idx < length);
36 return ptr[idx];
39 #endif
41 class ExternDClass;
42 struct ExternDStruct2;
43 struct ExternDStruct3;
45 struct ExternDStruct final
47 int32_t i;
48 double d;
49 ExternDStruct() :
50 i(),
51 d()
54 ExternDStruct(int32_t i, double d = NAN) :
55 i(i),
56 d(d)
60 enum class ExternDEnum
62 A = 0,
65 template <>
66 struct ExternDStructTemplate final
68 // Ignoring var i alignment 0
69 int32_t i;
70 // Ignoring var d alignment 0
71 double d;
72 ExternDStructTemplate()
77 class Object
79 virtual void __vtable_slot_0();
80 virtual void __vtable_slot_1();
81 virtual void __vtable_slot_2();
82 virtual void __vtable_slot_3();
83 public:
84 class Monitor
86 virtual void __vtable_slot_4();
87 virtual void __vtable_slot_5();
92 class ExternDClass : public Object
94 public:
95 int32_t i;
96 double d;
99 struct ExternDStruct2 final
101 int32_t doStuff();
102 ExternDStruct2()
107 struct ExternDStruct3 final
109 int32_t a;
110 ExternDStruct3() :
114 ExternDStruct3(int32_t a) :
115 a(a)
119 namespace ExternDEnum2
121 static ExternDStruct3 const A = ExternDStruct3(1);
124 struct ExternCppStruct final
126 ExternDStruct s;
127 ExternDEnum e;
128 ExternDStructTemplate< > st;
129 ExternCppStruct() :
130 s(),
131 st()
134 ExternCppStruct(ExternDStruct s, ExternDEnum e = (ExternDEnum)0, ExternDStructTemplate< > st = ExternDStructTemplate< >(0, NAN)) :
135 s(s),
136 e(e),
137 st(st)
141 extern ExternDClass* globalC;
143 extern void foo(int32_t arg = globalC.i);
145 extern ExternDStruct2* globalS2;
147 extern void bar(int32_t arg = globalS2->doStuff());
149 extern /* ExternDEnum2 */ ExternDStruct3* globalE2;
151 extern void baz(int32_t arg = globalE2->a);
154 Known issues:
155 - class declarations must be emitted on member access
158 // extern(D) symbols are ignored upon first visit but required later
160 struct ExternDStruct
162 int i;
163 double d;
165 // None of these can be emitted due to the mismatched mangling
166 static double staticDouble;
167 static shared double staticSharedDouble;
168 __gshared double sharedDouble;
171 struct ExternDStruct2
173 extern(C++) int doStuff()
175 return 1;
179 struct ExternDStruct3
181 int a;
184 class ExternDClass
186 int i;
187 double d;
190 enum ExternDEnum
195 enum ExternDEnum2 : ExternDStruct3
197 A = ExternDStruct3(1)
200 struct ExternDStructTemplate()
202 int i;
203 double d;
206 extern (C++):
208 struct ExternCppStruct
210 ExternDStruct s;
211 ExternDEnum e;
212 ExternDStructTemplate!() st;
215 __gshared ExternDClass globalC;
217 void foo(int arg = globalC.i) {}
219 __gshared ExternDStruct2* globalS2;
221 void bar(int arg = globalS2.doStuff()) {}
223 __gshared ExternDEnum2* globalE2;
225 void baz(int arg = globalE2.a) {}