summaryrefslogtreecommitdiffstats
path: root/test/CodeGenCXX/varargs.cpp
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2011-08-27 01:09:30 +0000
committerJohn McCall <rjmccall@apple.com>2011-08-27 01:09:30 +0000
commit5f8d604246976a93a73549b07bbc8ee0b2061b50 (patch)
tree77e085a2358201b9007429ba7cec2b156f556a3a /test/CodeGenCXX/varargs.cpp
parent6748ae15b3eed61b3b61f9b77470a802a1643fbb (diff)
The lvalue-to-rvalue on structs in C++ is actually part
of default argument promotion and needs to happen unconditionally. This is particularly semantically important in C++0x. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@138691 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGenCXX/varargs.cpp')
-rw-r--r--test/CodeGenCXX/varargs.cpp46
1 files changed, 36 insertions, 10 deletions
diff --git a/test/CodeGenCXX/varargs.cpp b/test/CodeGenCXX/varargs.cpp
index d469ae4f23..af34336a0a 100644
--- a/test/CodeGenCXX/varargs.cpp
+++ b/test/CodeGenCXX/varargs.cpp
@@ -1,17 +1,43 @@
-// RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck %s
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck %s
+
// rdar://7309675
// PR4678
+namespace test0 {
+ // test1 should be compmiled to be a varargs function in the IR even
+ // though there is no way to do a va_begin. Otherwise, the optimizer
+ // will warn about 'dropped arguments' at the call site.
-// test1 should be compmiled to be a varargs function in the IR even
-// though there is no way to do a va_begin. Otherwise, the optimizer
-// will warn about 'dropped arguments' at the call site.
+ // CHECK: define i32 @_ZN5test05test1Ez(...)
+ int test1(...) {
+ return -1;
+ }
-// CHECK: define i32 @_Z5test1z(...)
-int test1(...) {
- return -1;
+ // CHECK: call i32 (...)* @_ZN5test05test1Ez(i32 0)
+ void test() {
+ test1(0);
+ }
}
-// CHECK: call i32 (...)* @_Z5test1z(i32 0)
-void test() {
- test1(0);
+namespace test1 {
+ struct A {
+ int x;
+ int y;
+ };
+
+ void foo(...);
+
+ void test() {
+ A x;
+ foo(x);
+ }
+ // CHECK: define void @_ZN5test14testEv()
+ // CHECK: [[X:%.*]] = alloca [[A:%.*]], align 4
+ // CHECK-NEXT: [[TMP:%.*]] = alloca [[A]], align 4
+ // CHECK-NEXT: [[T0:%.*]] = bitcast [[A]]* [[TMP]] to i8*
+ // CHECK-NEXT: [[T1:%.*]] = bitcast [[A]]* [[X]] to i8*
+ // CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[T0]], i8* [[T1]], i64 8, i32 4, i1 false)
+ // CHECK-NEXT: [[T0:%.*]] = bitcast [[A]]* [[TMP]] to i64*
+ // CHECK-NEXT: [[T1:%.*]] = load i64* [[T0]], align 1
+ // CHECK-NEXT: call void (...)* @_ZN5test13fooEz(i64 [[T1]])
+ // CHECK-NEXT: ret void
}