xref: /minix3/external/bsd/llvm/dist/clang/test/CodeGenCXX/microsoft-abi-byval-vararg.cpp (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1*0a6a1f1dSLionel Sambuc // RUN: %clang_cc1 -Wno-non-pod-varargs -emit-llvm %s -o - -triple=i686-pc-win32 -mconstructor-aliases -fno-rtti | FileCheck %s
2*0a6a1f1dSLionel Sambuc 
3*0a6a1f1dSLionel Sambuc #include <stdarg.h>
4*0a6a1f1dSLionel Sambuc 
5*0a6a1f1dSLionel Sambuc struct A {
AA6*0a6a1f1dSLionel Sambuc   A(int a) : a(a) {}
AA7*0a6a1f1dSLionel Sambuc   A(const A &o) : a(o.a) {}
~AA8*0a6a1f1dSLionel Sambuc   ~A() {}
9*0a6a1f1dSLionel Sambuc   int a;
10*0a6a1f1dSLionel Sambuc };
11*0a6a1f1dSLionel Sambuc 
foo(A a,...)12*0a6a1f1dSLionel Sambuc int foo(A a, ...) {
13*0a6a1f1dSLionel Sambuc   va_list ap;
14*0a6a1f1dSLionel Sambuc   va_start(ap, a);
15*0a6a1f1dSLionel Sambuc   int sum = 0;
16*0a6a1f1dSLionel Sambuc   for (int i = 0; i < a.a; ++i)
17*0a6a1f1dSLionel Sambuc     sum += va_arg(ap, int);
18*0a6a1f1dSLionel Sambuc   va_end(ap);
19*0a6a1f1dSLionel Sambuc   return sum;
20*0a6a1f1dSLionel Sambuc }
21*0a6a1f1dSLionel Sambuc 
22*0a6a1f1dSLionel Sambuc // CHECK-LABEL: define i32 @"\01?foo@@YAHUA@@ZZ"(<{ %struct.A }>* inalloca, ...)
23*0a6a1f1dSLionel Sambuc 
main()24*0a6a1f1dSLionel Sambuc int main() {
25*0a6a1f1dSLionel Sambuc   return foo(A(3), 1, 2, 3);
26*0a6a1f1dSLionel Sambuc }
27*0a6a1f1dSLionel Sambuc // CHECK-LABEL: define i32 @main()
28*0a6a1f1dSLionel Sambuc // CHECK: %[[argmem:[^ ]*]] = alloca inalloca <{ %struct.A, i32, i32, i32 }>
29*0a6a1f1dSLionel Sambuc // CHECK: call i32 {{.*bitcast.*}}@"\01?foo@@YAHUA@@ZZ"{{.*}}(<{ %struct.A, i32, i32, i32 }>* inalloca %[[argmem]])
30*0a6a1f1dSLionel Sambuc 
31*0a6a1f1dSLionel Sambuc void varargs_zero(...);
32*0a6a1f1dSLionel Sambuc void varargs_one(int, ...);
33*0a6a1f1dSLionel Sambuc void varargs_two(int, int, ...);
34*0a6a1f1dSLionel Sambuc void varargs_three(int, int, int, ...);
call_var_args()35*0a6a1f1dSLionel Sambuc void call_var_args() {
36*0a6a1f1dSLionel Sambuc   A x(3);
37*0a6a1f1dSLionel Sambuc   varargs_zero(x);
38*0a6a1f1dSLionel Sambuc   varargs_one(1, x);
39*0a6a1f1dSLionel Sambuc   varargs_two(1, 2, x);
40*0a6a1f1dSLionel Sambuc   varargs_three(1, 2, 3, x);
41*0a6a1f1dSLionel Sambuc }
42*0a6a1f1dSLionel Sambuc 
43*0a6a1f1dSLionel Sambuc // CHECK-LABEL: define void @"\01?call_var_args@@YAXXZ"()
44*0a6a1f1dSLionel Sambuc // CHECK: call void {{.*bitcast.*varargs_zero.*}}(<{ %struct.A }>* inalloca %{{.*}})
45*0a6a1f1dSLionel Sambuc // CHECK: call void {{.*bitcast.*varargs_one.*}}(<{ i32, %struct.A }>* inalloca %{{.*}})
46*0a6a1f1dSLionel Sambuc // CHECK: call void {{.*bitcast.*varargs_two.*}}(<{ i32, i32, %struct.A }>* inalloca %{{.*}})
47*0a6a1f1dSLionel Sambuc // CHECK: call void {{.*bitcast.*varargs_three.*}}(<{ i32, i32, i32, %struct.A }>* inalloca %{{.*}})
48*0a6a1f1dSLionel Sambuc 
49*0a6a1f1dSLionel Sambuc // CHECK-LABEL: declare void @"\01?varargs_zero@@YAXZZ"(...)
50*0a6a1f1dSLionel Sambuc // CHECK-LABEL: declare void @"\01?varargs_one@@YAXHZZ"(i32, ...)
51*0a6a1f1dSLionel Sambuc // CHECK-LABEL: declare void @"\01?varargs_two@@YAXHHZZ"(i32, i32, ...)
52*0a6a1f1dSLionel Sambuc // CHECK-LABEL: declare void @"\01?varargs_three@@YAXHHHZZ"(i32, i32, i32, ...)
53