annotate gcc/testsuite/gdc.test/runnable_cxx/cpp_abi_tests.d @ 152:2b5abeee2509

update gcc11
author anatofuz
date Mon, 25 May 2020 07:50:57 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
152
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1 // EXTRA_CPP_SOURCES: cpp_abi_tests.cpp
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
3 extern(C++) {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
4
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
5 struct S
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
6 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
7 float a = 1;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
8 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
9
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
10 bool passthrough(bool value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
11 byte passthrough(byte value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
12 ubyte passthrough(ubyte value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
13 char passthrough(char value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
14 dchar passthrough(dchar value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
15 short passthrough(short value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
16 ushort passthrough(ushort value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
17 int passthrough(int value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
18 uint passthrough(uint value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
19 long passthrough(long value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
20 ulong passthrough(ulong value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
21 float passthrough(float value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
22 double passthrough(double value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
23 S passthrough(S value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
24
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
25 bool passthrough_ptr(bool *value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
26 byte passthrough_ptr(byte *value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
27 ubyte passthrough_ptr(ubyte *value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
28 char passthrough_ptr(char *value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
29 dchar passthrough_ptr(dchar *value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
30 short passthrough_ptr(short *value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
31 ushort passthrough_ptr(ushort *value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
32 int passthrough_ptr(int *value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
33 uint passthrough_ptr(uint *value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
34 long passthrough_ptr(long *value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
35 ulong passthrough_ptr(ulong *value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
36 float passthrough_ptr(float *value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
37 double passthrough_ptr(double *value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
38 S passthrough_ptr(S *value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
39
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
40 bool passthrough_ref(ref bool value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
41 byte passthrough_ref(ref byte value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
42 ubyte passthrough_ref(ref ubyte value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
43 char passthrough_ref(ref char value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
44 dchar passthrough_ref(ref dchar value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
45 short passthrough_ref(ref short value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
46 ushort passthrough_ref(ref ushort value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
47 int passthrough_ref(ref int value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
48 uint passthrough_ref(ref uint value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
49 long passthrough_ref(ref long value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
50 ulong passthrough_ref(ref ulong value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
51 float passthrough_ref(ref float value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
52 double passthrough_ref(ref double value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
53 S passthrough_ref(ref S value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
54 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
55
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
56 template IsSigned(T)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
57 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
58 enum IsSigned = is(T==byte) ||
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
59 is(T==short) ||
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
60 is(T==int) ||
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
61 is(T==long);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
62 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
63
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
64 template IsUnsigned(T)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
65 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
66 enum IsUnsigned = is(T==ubyte) ||
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
67 is(T==ushort) ||
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
68 is(T==uint) ||
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
69 is(T==ulong);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
70 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
71
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
72 template IsIntegral(T)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
73 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
74 enum IsIntegral = IsSigned!T || IsUnsigned!T;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
75 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
76
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
77 template IsFloatingPoint(T)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
78 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
79 enum IsFloatingPoint = is(T==float) || is(T==double) || is(T==real);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
80 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
81
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
82 template IsBoolean(T)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
83 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
84 enum IsBoolean = is(T==bool);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
85 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
86
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
87 template IsSomeChar(T)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
88 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
89 enum IsSomeChar = is(T==char) || is(T==dchar);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
90 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
91
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
92 void check(T)(T actual, T expected)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
93 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
94 assert(actual is expected);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
95 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
96
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
97 void check(T)(T value)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
98 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
99 check(passthrough(value), value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
100 check(passthrough_ptr(&value), value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
101 check(passthrough_ref(value), value);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
102 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
103
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
104 T[] values(T)()
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
105 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
106 T[] values;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
107 static if(IsBoolean!T)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
108 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
109 values ~= true;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
110 values ~= false;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
111 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
112 else static if(IsSomeChar!T)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
113 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
114 values ~= T.init;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
115 values ~= T('a');
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
116 values ~= T('z');
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
117 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
118 else
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
119 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
120 values ~= T(0);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
121 values ~= T(1);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
122 static if(IsIntegral!T)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
123 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
124 static if(IsSigned!T) values ~= T.min;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
125 values ~= T.max;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
126 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
127 else static if(IsFloatingPoint!T)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
128 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
129 values ~= T.nan;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
130 values ~= T.min_normal;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
131 values ~= T.max;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
132 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
133 else
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
134 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
135 assert(0);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
136 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
137 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
138 return values;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
139 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
140
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
141 void main()
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
142 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
143 foreach(bool val; values!bool()) check(val);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
144 foreach(byte val; values!byte()) check(val);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
145 foreach(ubyte val; values!ubyte()) check(val);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
146 foreach(char val; values!char()) check(val);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
147 foreach(dchar val; values!dchar()) check(val);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
148 foreach(short val; values!short()) check(val);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
149 foreach(ushort val; values!ushort()) check(val);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
150 foreach(int val; values!int()) check(val);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
151 foreach(uint val; values!uint()) check(val);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
152 foreach(long val; values!long()) check(val);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
153 foreach(ulong val; values!ulong()) check(val);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
154 foreach(float val; values!float()) check(val);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
155 foreach(double val; values!double()) check(val);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
156 check(S());
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
157 }