]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/testsuite/gdc.test/runnable_cxx/test7925.d
d: Merge upstream dmd 3982604c5, druntime bc58b1e9, phobos 12329adb6.
[thirdparty/gcc.git] / gcc / testsuite / gdc.test / runnable_cxx / test7925.d
1 // EXTRA_CPP_SOURCES: cpp7925.cpp
2
3 /*
4 Exclude -O due to a codegen bug on OSX:
5 https://issues.dlang.org/show_bug.cgi?id=22556
6
7 PERMUTE_ARGS(osx): -inline -release -g
8 */
9
10 import core.vararg;
11
12 extern(C++) class C1
13 {
14 public:
15 ~this();
16
17 int i;
18
19 final int f0();
20 final int f1(int a);
21 final int f2(int a, int b);
22 int f3(int a, int b);
23 final int f4(int a, ...);
24 };
25
26 extern(C++) C1 createC1();
27
28 extern(C++) class C2
29 {
30 public:
31 ~this()
32 {
33 }
34
35 int i;
36
37 final int f0()
38 {
39 return i;
40 }
41
42 final int f1(int a)
43 {
44 return i + a;
45 }
46
47 final int f2(int a, int b)
48 {
49 return i + a + b;
50 }
51
52 int f3(int a, int b)
53 {
54 return i + a + b;
55 }
56
57 final int f4(int a, ...)
58 {
59 int r = i + a;
60 int last = a;
61
62 va_list argp;
63 va_start(argp, a);
64 while (last)
65 {
66 last = va_arg!int(argp);
67 r += last;
68 }
69 va_end(argp);
70 return r;
71 }
72 };
73
74 extern(C++) C2 createC2()
75 {
76 return new C2;
77 }
78
79 auto callMember(alias F, Params...)(__traits(parent, F) obj, Params params)
80 {
81 static if(__traits(getFunctionVariadicStyle, F) == "stdarg")
82 enum varargSuffix = ", ...";
83 else
84 enum varargSuffix = "";
85
86 static if(is(typeof(&F) R == return) && is(typeof(F) P == __parameters))
87 mixin("extern(" ~ __traits(getLinkage, F) ~ ") R delegate(P" ~ varargSuffix ~ ") dg;");
88 dg.funcptr = &F;
89 dg.ptr = cast(void*)obj;
90 return dg(params);
91 }
92
93 extern(C++) void runCPPTests();
94
95 void main()
96 {
97 C1 c1 = createC1();
98 c1.i = 100;
99 assert(c1.f0() == 100);
100 assert(c1.f1(1) == 101);
101 assert(c1.f2(20, 3) == 123);
102 assert(c1.f3(20, 3) == 123);
103 assert(c1.f4(20, 3, 0) == 123);
104
105 auto dg0 = &c1.f0;
106 auto dg1 = &c1.f1;
107 auto dg2 = &c1.f2;
108 auto dg3 = &c1.f3;
109 auto dg4 = &c1.f4;
110 assert(dg0() == 100);
111 assert(dg1(1) == 101);
112 assert(dg2(20, 3) == 123);
113 assert(dg3(20, 3) == 123);
114 assert(dg4(20, 3, 0) == 123);
115
116 assert(callMember!(C1.f0)(c1) == 100);
117 assert(callMember!(C1.f1)(c1, 1) == 101);
118 assert(callMember!(C1.f2)(c1, 20, 3) == 123);
119 assert(callMember!(C1.f3)(c1, 20, 3) == 123);
120 assert(callMember!(C1.f4)(c1, 20, 3, 0) == 123);
121
122 int i;
123 extern(C++) void delegate() lamdba1 = () {
124 i = 5;
125 };
126 lamdba1();
127 assert(i == 5);
128
129 extern(C++) int function(int, int) lamdba2 = (int a, int b) {
130 return a + b;
131 };
132 assert(lamdba2(3, 4) == 7);
133
134 extern(C++) void delegate(int, ...) lamdba3 = (int a, ...) {
135 i = a;
136 int last = a;
137
138 va_list argp;
139 va_start(argp, a);
140 while (last)
141 {
142 last = va_arg!int(argp);
143 i += last;
144 }
145 va_end(argp);
146 };
147 lamdba3(1000, 200, 30, 4, 0);
148 assert(i == 1234);
149
150 runCPPTests();
151 }