diff options
author | John McCall <rjmccall@apple.com> | 2011-08-27 01:09:30 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2011-08-27 01:09:30 +0000 |
commit | 5f8d604246976a93a73549b07bbc8ee0b2061b50 (patch) | |
tree | 77e085a2358201b9007429ba7cec2b156f556a3a /test/CodeGenCXX/varargs.cpp | |
parent | 6748ae15b3eed61b3b61f9b77470a802a1643fbb (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.cpp | 46 |
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 } |