1 // EXTRA_CPP_SOURCES: cpp7925.cpp
4 Exclude -O due to a codegen bug on OSX:
5 https://issues.dlang.org/show_bug.cgi?id=22556
7 PERMUTE_ARGS(osx): -inline -release -g
21 final int f2(int a, int b);
23 final int f4(int a, ...);
26 extern(C++) C1 createC1();
47 final int f2(int a, int b)
57 final int f4(int a, ...)
66 last = va_arg!int(argp);
74 extern(C++) C2 createC2()
79 auto callMember(alias F, Params...)(__traits(parent, F) obj, Params params)
81 static if(__traits(getFunctionVariadicStyle, F) == "stdarg")
82 enum varargSuffix = ", ...";
84 enum varargSuffix = "";
86 static if(is(typeof(&F) R == return) && is(typeof(F) P == __parameters))
87 mixin("extern(" ~ __traits(getLinkage, F) ~ ") R delegate(P" ~ varargSuffix ~ ") dg;");
89 dg.ptr = cast(void*)obj;
93 extern(C++) void runCPPTests();
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);
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);
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);
123 extern(C++) void delegate() lamdba1 = () {
129 extern(C++) int function(int, int) lamdba2 = (int a, int b) {
132 assert(lamdba2(3, 4) == 7);
134 extern(C++) void delegate(int, ...) lamdba3 = (int a, ...) {
142 last = va_arg!int(argp);
147 lamdba3(1000, 200, 30, 4, 0);