diff options
Diffstat (limited to 'clang/test/CodeGenCXX/lvalue-bitcasts.cpp')
-rw-r--r-- | clang/test/CodeGenCXX/lvalue-bitcasts.cpp | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/clang/test/CodeGenCXX/lvalue-bitcasts.cpp b/clang/test/CodeGenCXX/lvalue-bitcasts.cpp new file mode 100644 index 0000000..8c5fa4a --- /dev/null +++ b/clang/test/CodeGenCXX/lvalue-bitcasts.cpp @@ -0,0 +1,163 @@ +// RUN: %clang_cc1 -triple x86_64-apple-darwin10.0.0 -emit-llvm -o - %s | FileCheck %s + +struct X { int i; float f; }; +struct Y { X x; }; + +// CHECK: define void @_Z21reinterpret_cast_testRiRfR1X +void reinterpret_cast_test(int &ir, float &fr, X &xr) { + // CHECK: load float** + // CHECK: bitcast float* + // CHECK: load i32* + ir = reinterpret_cast<int&>(fr); + // CHECK: load + // CHECK: {{bitcast.*to i32\*}} + // CHECK: load i32* + ir = reinterpret_cast<int&>(xr); + // CHECK: load i32 + // CHECK: {{bitcast.*to float\*}} + // CHECK: load float* + fr = reinterpret_cast<float&>(ir); + // CHECK: load + // CHECK: {{bitcast.*to float\*}} + // CHECK: load float* + fr = reinterpret_cast<float&>(xr); + // CHECK: load i32** + // CHECK: bitcast i32* + // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64 + xr = reinterpret_cast<X&>(ir); + // CHECK: load float** + // CHECK: bitcast float* + // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64 + xr = reinterpret_cast<X&>(fr); + _Complex float cf; + _Complex float &cfr = cf; + // CHECK: load i32** + // CHECK: bitcast i32* + // CHECK: load float* + // CHECK: load float* + cfr = reinterpret_cast<_Complex float&>(ir); + // CHECK: load float** + // CHECK: bitcast float* + // CHECK: load float* + // CHECK: load float* + cfr = reinterpret_cast<_Complex float&>(fr); + // CHECK: bitcast + // CHECK: load float* + // CHECK: load float* + cfr = reinterpret_cast<_Complex float&>(xr); + // CHECK: ret void +} + +// CHECK: define void @_Z6c_castRiRfR1X +void c_cast(int &ir, float &fr, X &xr) { + // CHECK: load float** + // CHECK: bitcast float* + // CHECK: load i32* + ir = (int&)fr; + // CHECK: load + // CHECK: {{bitcast.*to i32\*}} + // CHECK: load i32* + ir = (int&)xr; + // CHECK: load i32 + // CHECK: {{bitcast.*to float\*}} + // CHECK: load float* + fr = (float&)ir; + // CHECK: load + // CHECK: {{bitcast.*to float\*}} + // CHECK: load float* + fr = (float&)xr; + // CHECK: load i32** + // CHECK: bitcast i32* + // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64 + xr = (X&)ir; + // CHECK: load float** + // CHECK: bitcast float* + // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64 + xr = (X&)fr; + _Complex float cf; + _Complex float &cfr = cf; + // CHECK: load i32** + // CHECK: bitcast i32* + // CHECK: load float* + // CHECK: load float* + cfr = (_Complex float&)ir; + // CHECK: load float** + // CHECK: bitcast float* + // CHECK: load float* + // CHECK: load float* + cfr = (_Complex float&)fr; + // CHECK: bitcast + // CHECK: load float* + // CHECK: load float* + cfr = (_Complex float&)xr; + // CHECK: ret void +} + +// CHECK: define void @_Z15functional_castRiRfR1X +void functional_cast(int &ir, float &fr, X &xr) { + typedef int &intref; + typedef float &floatref; + typedef X &Xref; + // CHECK: load float** + // CHECK: bitcast float* + // CHECK: load i32* + ir = intref(fr); + // CHECK: load + // CHECK: {{bitcast.*to i32\*}} + // CHECK: load i32* + ir = intref(xr); + // CHECK: load i32 + // CHECK: {{bitcast.*to float\*}} + // CHECK: load float* + fr = floatref(ir); + // CHECK: load + // CHECK: {{bitcast.*to float\*}} + // CHECK: load float* + fr = floatref(xr); + // CHECK: load i32** + // CHECK: bitcast i32* + // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64 + xr = Xref(ir); + // CHECK: load float** + // CHECK: bitcast float* + // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64 + xr = Xref(fr); + typedef _Complex float &complex_float_ref; + _Complex float cf; + _Complex float &cfr = cf; + // CHECK: load i32** + // CHECK: bitcast i32* + // CHECK: load float* + // CHECK: load float* + cfr = complex_float_ref(ir); + // CHECK: load float** + // CHECK: bitcast float* + // CHECK: load float* + // CHECK: load float* + cfr = complex_float_ref(fr); + // CHECK: bitcast + // CHECK: load float* + // CHECK: load float* + cfr = complex_float_ref(xr); + // CHECK: ret void +} + +namespace PR6437 { + struct in_addr {}; + void copy( const struct in_addr &new_addr ) { + int addr = (int&)new_addr; + } +} + +namespace PR7593 { + void foo(double &X, char *A) { + X = reinterpret_cast<double&>(A[4]); + } +} + +namespace PR7344 { + void serialize_annotatable_id( void*& id ) + { + unsigned long l_id = (unsigned long&)id; + } +} |