xref: /aosp_15_r20/external/clang/test/CodeGenCXX/varargs.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li // rdar://7309675
4*67e74705SXin Li // PR4678
5*67e74705SXin Li namespace test0 {
6*67e74705SXin Li   // test1 should be compmiled to be a varargs function in the IR even
7*67e74705SXin Li   // though there is no way to do a va_begin.  Otherwise, the optimizer
8*67e74705SXin Li   // will warn about 'dropped arguments' at the call site.
9*67e74705SXin Li 
10*67e74705SXin Li   // CHECK-LABEL: define i32 @_ZN5test05test1Ez(...)
test1(...)11*67e74705SXin Li   int test1(...) {
12*67e74705SXin Li     return -1;
13*67e74705SXin Li   }
14*67e74705SXin Li 
15*67e74705SXin Li   // CHECK: call i32 (...) @_ZN5test05test1Ez(i32 0)
test()16*67e74705SXin Li   void test() {
17*67e74705SXin Li     test1(0);
18*67e74705SXin Li   }
19*67e74705SXin Li }
20*67e74705SXin Li 
21*67e74705SXin Li namespace test1 {
22*67e74705SXin Li   struct A {
23*67e74705SXin Li     int x;
24*67e74705SXin Li     int y;
25*67e74705SXin Li   };
26*67e74705SXin Li 
27*67e74705SXin Li   void foo(...);
28*67e74705SXin Li 
test()29*67e74705SXin Li   void test() {
30*67e74705SXin Li     A x;
31*67e74705SXin Li     foo(x);
32*67e74705SXin Li   }
33*67e74705SXin Li   // CHECK-LABEL:    define void @_ZN5test14testEv()
34*67e74705SXin Li   // CHECK:      [[X:%.*]] = alloca [[A:%.*]], align 4
35*67e74705SXin Li   // CHECK-NEXT: [[TMP:%.*]] = alloca [[A]], align 4
36*67e74705SXin Li   // CHECK-NEXT: [[T0:%.*]] = bitcast [[A]]* [[TMP]] to i8*
37*67e74705SXin Li   // CHECK-NEXT: [[T1:%.*]] = bitcast [[A]]* [[X]] to i8*
38*67e74705SXin Li   // CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[T0]], i8* [[T1]], i64 8, i32 4, i1 false)
39*67e74705SXin Li   // CHECK-NEXT: [[T0:%.*]] = bitcast [[A]]* [[TMP]] to i64*
40*67e74705SXin Li   // CHECK-NEXT: [[T1:%.*]] = load i64, i64* [[T0]], align 4
41*67e74705SXin Li   // CHECK-NEXT: call void (...) @_ZN5test13fooEz(i64 [[T1]])
42*67e74705SXin Li   // CHECK-NEXT: ret void
43*67e74705SXin Li }
44