d: Merge upstream dmd 568496d5b, druntime 178c44ff, phobos 574bf883b.
[official-gcc.git] / gcc / testsuite / gdc.test / compilable / dtoh_TemplateDeclaration.d
blob5f747fda8c89ff1323842c55a652087851019e41
1 /*
2 REQUIRED_ARGS: -HC -c -o-
3 PERMUTE_ARGS:
4 TEST_OUTPUT:
5 ---
6 // Automatically generated by Digital Mars D Compiler
8 #pragma once
10 #include <assert.h>
11 #include <stddef.h>
12 #include <stdint.h>
13 #include <math.h>
15 #ifdef CUSTOM_D_ARRAY_TYPE
16 #define _d_dynamicArray CUSTOM_D_ARRAY_TYPE
17 #else
18 /// Represents a D [] array
19 template<typename T>
20 struct _d_dynamicArray final
22 size_t length;
23 T *ptr;
25 _d_dynamicArray() : length(0), ptr(NULL) { }
27 _d_dynamicArray(size_t length_in, T *ptr_in)
28 : length(length_in), ptr(ptr_in) { }
30 T& operator[](const size_t idx) {
31 assert(idx < length);
32 return ptr[idx];
35 const T& operator[](const size_t idx) const {
36 assert(idx < length);
37 return ptr[idx];
40 #endif
42 typedef uint$?:32=32|64=64$_t size_t;
44 struct Outer final
46 int32_t a;
47 struct Member final
49 typedef int32_t Nested;
50 Member()
55 Outer() :
56 a()
59 Outer(int32_t a) :
60 a(a)
64 enum : int32_t { SomeOtherLength = 1 };
66 struct ActualBuffer final
68 ActualBuffer()
73 template <typename T>
74 struct A final
76 // Ignoring var x alignment 0
77 T x;
78 // Ignoring var Enum alignment 0
79 enum : int32_t { Enum = 42 };
81 // Ignoring var GsharedNum alignment 0
82 static int32_t GsharedNum;
83 // Ignoring var MemNum alignment 0
84 const int32_t MemNum;
85 void foo();
86 A()
91 template <typename T>
92 struct NotInstantiated final
94 // Ignoring var noInit alignment 0
95 // Ignoring var missingSem alignment 0
96 NotInstantiated()
101 struct B final
103 A<int32_t > x;
104 B() :
108 B(A<int32_t > x) :
109 x(x)
113 template <typename T>
114 struct Foo final
116 // Ignoring var val alignment 0
117 T val;
118 Foo()
123 template <typename T>
124 struct Bar final
126 // Ignoring var v alignment 0
127 Foo<T > v;
128 Bar()
133 template <typename T>
134 struct Array final
136 typedef Array This;
137 typedef typeof(1 + 2) Int;
138 typedef typeof(T::a) IC;
139 Array(size_t dim);
140 ~Array();
141 void get() const;
142 template <typename T>
143 bool opCast() const;
144 // Ignoring var i alignment 0
145 typename T::Member i;
146 // Ignoring var j alignment 0
147 typename Outer::Member::Nested j;
148 void visit(typename T::Member::Nested i);
149 Array()
154 template <typename T, typename U>
155 extern T foo(U u);
157 extern A<A<int32_t > > aaint;
159 template <typename T>
160 class Parent
162 // Ignoring var parentMember alignment 0
163 public:
164 T parentMember;
165 void parentFinal();
166 virtual void parentVirtual();
169 template <typename T>
170 class Child final : public Parent<T >
172 // Ignoring var childMember alignment 0
173 public:
174 T childMember;
175 void parentVirtual();
176 T childFinal();
179 extern void withDefTempl(A<int32_t > a = A<int32_t >(2, 13));
181 template <typename T>
182 extern void withDefTempl2(A<T > a = static_cast<A<T >>(A<T >(2)));
184 class ChildInt : public Parent<int32_t >
188 struct HasMixins final
190 void foo(int32_t t);
191 HasMixins()
196 template <typename T>
197 struct HasMixinsTemplate final
199 void foo(T t);
200 HasMixinsTemplate()
205 extern HasMixinsTemplate<bool > hmti;
207 template <typename T>
208 struct NotAA final
210 // Ignoring var length alignment 0
211 enum : int32_t { length = 12 };
213 // Ignoring var buffer alignment 0
214 T buffer[length];
215 // Ignoring var otherBuffer alignment 0
216 T otherBuffer[SomeOtherLength];
217 // Ignoring var calcBuffer alignment 0
218 T calcBuffer[foo(1)];
219 NotAA()
224 template <typename Buffer>
225 struct BufferTmpl final
227 // Ignoring var buffer alignment 0
228 Buffer buffer;
229 // Ignoring var buffer2 alignment 0
230 Buffer buffer2;
231 BufferTmpl()
236 struct ImportedBuffer final
238 typedef ActualBuffer Buffer;
239 ActualBuffer buffer2;
240 ImportedBuffer()
247 extern (C++) struct A(T)
249 T x;
250 enum Enum = 42;
251 __gshared GsharedNum = 43;
252 immutable MemNum = 13;
253 void foo() {}
256 // Invalid declarations accepted because it's not instantiated
257 extern (C++) struct NotInstantiated(T)
259 enum T noInit;
260 enum missingSem = T.init;
263 extern (C++) struct B
265 A!int x;
268 // https://issues.dlang.org/show_bug.cgi?id=20604
269 extern(C++)
271 struct Foo (T)
273 T val;
276 struct Bar (T)
278 Foo!T v;
282 extern (C++) struct Array(T)
284 alias This = typeof(this);
285 alias Int = typeof(1 + 2);
286 alias IC = typeof(T.a);
288 this(size_t dim) pure nothrow {}
289 @disable this(this);
290 ~this() {}
291 void get() const {}
293 bool opCast(T)() const pure nothrow @nogc @safe
294 if (is(T == bool))
296 return str.ptr !is null;
299 T.Member i;
300 Outer.Member.Nested j;
301 void visit(T.Member.Nested i) {}
304 struct Outer
306 int a;
307 static struct Member
309 alias Nested = int;
313 // alias AO = Array!Outer;
315 extern(C++) T foo(T, U)(U u) { return T.init; }
317 extern(C++) __gshared A!(A!int) aaint;
319 extern(C++) class Parent(T)
321 T parentMember;
322 final void parentFinal() {}
323 void parentVirtual() {}
326 extern(C++) final class Child(T) : Parent!T
328 T childMember;
329 override void parentVirtual() {}
330 T childFinal() { return T.init; }
333 extern(C++) void withDefTempl(A!int a = A!int(2)) {}
335 extern(C++) void withDefTempl2(T)(A!T a = A!T(2)) {}
337 extern(C++) alias withDefTempl2Inst = withDefTempl2!int;
339 extern(C++) class ChildInt : Parent!int {}
341 /******************************************************
342 * Mixins
345 extern (C++):
347 mixin template MixinA(T)
349 void foo(T t) {}
352 mixin template MixinB() {}
354 struct HasMixins
356 mixin MixinA!int;
357 mixin MixinB;
360 struct HasMixinsTemplate(T)
362 mixin MixinA!T;
363 mixin MixinB;
366 __gshared HasMixinsTemplate!bool hmti;
368 /// Declarations that look like associative arrays
370 extern(D) enum SomeOtherLength = 1;
372 struct NotAA(T)
374 private:
375 enum length = 12;
376 public:
377 T[length] buffer;
378 T[SomeOtherLength] otherBuffer;
379 T[foo(1)] calcBuffer;
382 // Same name but hidden by the template paramter
383 extern (D) struct Buffer {}
384 extern (D) struct ActualBuffer {}
386 struct BufferTmpl(Buffer)
388 Buffer buffer;
389 mixin BufferMixin!();
392 struct ImportedBuffer
394 alias Buffer = ActualBuffer;
395 mixin BufferMixin!();
398 mixin template BufferMixin()
400 Buffer buffer2;