diff options
Diffstat (limited to 'clang/test/CodeGenCXX/microsoft-abi-byval-vararg.cpp')
-rw-r--r-- | clang/test/CodeGenCXX/microsoft-abi-byval-vararg.cpp | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/clang/test/CodeGenCXX/microsoft-abi-byval-vararg.cpp b/clang/test/CodeGenCXX/microsoft-abi-byval-vararg.cpp new file mode 100644 index 00000000000..33619216e88 --- /dev/null +++ b/clang/test/CodeGenCXX/microsoft-abi-byval-vararg.cpp @@ -0,0 +1,27 @@ +// RUN: %clang_cc1 -emit-llvm %s -o - -triple=i686-pc-win32 -mconstructor-aliases -fno-rtti | FileCheck %s + +#include <stdarg.h> + +struct A { + A(int a) : a(a) {} + A(const A &o) : a(o.a) {} + ~A() {} + int a; +}; + +int foo(A a, ...) { + va_list ap; + va_start(ap, a); + int sum = 0; + for (int i = 0; i < a.a; ++i) + sum += va_arg(ap, int); + va_end(ap); + return sum; +} + +int main() { + return foo(A(3), 1, 2, 3); +} +// CHECK-LABEL: define i32 @main() +// CHECK: %[[argmem_cast:[^ ]*]] = bitcast <{ %struct.A, i32, i32, i32 }>* %argmem to <{ %struct.A }>* +// CHECK: call i32 (<{ %struct.A }>*, ...)* @"\01?foo@@YAHUA@@ZZ"(<{ %struct.A }>* inalloca %[[argmem_cast]]) |