]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/testsuite/gdc.test/runnable_cxx/extra-files/cpp_abi_tests.cpp
d: Import dmd b8384668f, druntime e6caaab9, phobos 5ab9ad256 (v2.098.0-beta.1)
[thirdparty/gcc.git] / gcc / testsuite / gdc.test / runnable_cxx / extra-files / cpp_abi_tests.cpp
1 #include <assert.h>
2
3 struct S{
4 float a;
5 };
6
7 namespace std
8 {
9 struct test19248_ {int a;}; // Remove when `extern(C++, ns)` is gone
10 struct test19248 {int a;};
11 };
12
13 #ifdef __DMC__
14 // DMC doesn't support c++11
15 #elif defined (_MSC_VER) && _MSC_VER <= 1800
16 // MSVC2013 doesn't support char16_t/char32_t
17 #else
18 #define TEST_UNICODE
19 #endif
20
21 struct S18784
22 {
23 int i;
24 S18784(int n);
25 };
26
27 S18784::S18784(int n) : i(n) {}
28
29 #ifdef __DMC__ // DMC doesn't support c++11
30 template <class>
31 #else
32 template <class...>
33 #endif
34 struct SPack
35 {
36 int i;
37 };
38
39 typedef SPack<int> SInt;
40
41 bool passthrough(bool value) { return value; }
42 signed char passthrough(signed char value) { return value; }
43 unsigned char passthrough(unsigned char value) { return value; }
44 char passthrough(char value) { return value; }
45 #ifdef TEST_UNICODE
46 char16_t passthrough(char16_t value) { return value; }
47 char32_t passthrough(char32_t value) { return value; }
48 #endif
49 wchar_t passthrough(wchar_t value) { return value; }
50 short passthrough(short value) { return value; }
51 unsigned short passthrough(unsigned short value) { return value; }
52 int passthrough(int value) { return value; }
53 unsigned int passthrough(unsigned int value) { return value; }
54 long passthrough(long value) { return value; }
55 unsigned long passthrough(unsigned long value) { return value; }
56 long long passthrough(long long value) { return value; }
57 unsigned long long passthrough(unsigned long long value) { return value; }
58 float passthrough(float value) { return value; }
59 double passthrough(double value) { return value; }
60 S passthrough(S value) { return value; }
61 std::test19248 passthrough(const std::test19248 value) { return value; }
62 std::test19248_ passthrough(const std::test19248_ value) { return value; }
63 SInt passthrough(SInt value) { return value; }
64
65 bool passthrough_ptr(bool *value) { return *value; }
66 signed char passthrough_ptr(signed char *value) { return *value; }
67 unsigned char passthrough_ptr(unsigned char *value) { return *value; }
68 char passthrough_ptr(char *value) { return *value; }
69 #ifdef TEST_UNICODE
70 char16_t passthrough_ptr(char16_t *value) { return *value; }
71 char32_t passthrough_ptr(char32_t *value) { return *value; }
72 #endif
73 wchar_t passthrough_ptr(wchar_t *value) { return *value; }
74 short passthrough_ptr(short *value) { return *value; }
75 unsigned short passthrough_ptr(unsigned short *value) { return *value; }
76 int passthrough_ptr(int *value) { return *value; }
77 unsigned int passthrough_ptr(unsigned int *value) { return *value; }
78 long passthrough_ptr(long *value) { return *value; }
79 unsigned long passthrough_ptr(unsigned long *value) { return *value; }
80 long long passthrough_ptr(long long *value) { return *value; }
81 unsigned long long passthrough_ptr(unsigned long long *value) { return *value; }
82 float passthrough_ptr(float *value) { return *value; }
83 double passthrough_ptr(double *value) { return *value; }
84 S passthrough_ptr(S *value) { return *value; }
85 std::test19248 passthrough_ptr(const std::test19248 *value) { return *value; }
86 std::test19248_ passthrough_ptr(const std::test19248_ *value) { return *value; }
87 SInt passthrough_ptr(SInt *value) { return *value; }
88
89 bool passthrough_ref(bool &value) { return value; }
90 signed char passthrough_ref(signed char &value) { return value; }
91 unsigned char passthrough_ref(unsigned char &value) { return value; }
92 char passthrough_ref(char &value) { return value; }
93 #ifdef TEST_UNICODE
94 char16_t passthrough_ref(char16_t &value) { return value; }
95 char32_t passthrough_ref(char32_t &value) { return value; }
96 #endif
97 wchar_t passthrough_ref(wchar_t &value) { return value; }
98 short passthrough_ref(short &value) { return value; }
99 unsigned short passthrough_ref(unsigned short &value) { return value; }
100 int passthrough_ref(int &value) { return value; }
101 unsigned int passthrough_ref(unsigned int &value) { return value; }
102 long passthrough_ref(long &value) { return value; }
103 unsigned long passthrough_ref(unsigned long &value) { return value; }
104 long long passthrough_ref(long long &value) { return value; }
105 unsigned long long passthrough_ref(unsigned long long &value) { return value; }
106 float passthrough_ref(float &value) { return value; }
107 double passthrough_ref(double &value) { return value; }
108 S passthrough_ref(S &value) { return value; }
109 std::test19248 passthrough_ref(const std::test19248 &value) { return value; }
110 std::test19248_ passthrough_ref(const std::test19248_ &value) { return value; }
111 SInt passthrough_ref(SInt &value) { return value; }
112
113 namespace ns1
114 {
115 // D: `char*, const(char)**`
116 int constFunction1(const char*, const char**) { return 1; }
117 // D: `const(char)*, const(char*)*`
118 int constFunction2(const char*, const char* const*) { return 2; }
119 // D: `const(char*), const(char**)*`
120 int constFunction3(const char* const, const char* const* const*) { return 3; }
121 // D: `const(char*), const(char***)`
122 int constFunction4(const char* const, const char* const* const* const) { return 42; }
123 };
124
125 struct SmallStruct
126 {
127 int i;
128 SmallStruct(int); // implemented in D
129 SmallStruct(const SmallStruct &);
130 };
131 SmallStruct::SmallStruct(const SmallStruct &rhs)
132 : i(rhs.i + 10) {}
133 void smallStructCallBack(SmallStruct p);
134 void smallStructTest(SmallStruct p)
135 {
136 assert(p.i == 52);
137
138 smallStructCallBack(p);
139 assert(p.i == 52);
140 }
141
142 struct Sdtor
143 {
144 static int counter;
145 ~Sdtor();
146 };
147
148 Sdtor::~Sdtor() { ++counter; }
149 int Sdtor::counter = 0;
150
151 void consume(Sdtor value) {}
152
153 void consume2(Sdtor value);
154 void doConsume2(Sdtor& value)
155 {
156 consume2(value);
157 }
158
159 // Uncomment when mangling is fixed
160 // typedef void(*fn0)();
161 // fn0 passthrough_fn0 (fn0 value) { return value; }
162 // typedef int (*fn1)(int);
163 // fn1 passthrough_fn1 (fn1 value) { return value; }