| // RUN: %clang_cc1 -emit-llvm -triple x86_64-apple-darwin10 -o - %s | FileCheck %s | |
| // PR6024 | |
| extern int i; | |
| // CHECK: define{{.*}} nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_Z16lvalue_noop_castv() [[NUW:#[0-9]+]] | |
| const int &lvalue_noop_cast() { | |
| if (i == 0) | |
| // CHECK: store i32 17, ptr | |
| return (const int&)17; | |
| else if (i == 1) | |
| // CHECK: store i32 17, ptr | |
| return static_cast<const int&>(17); | |
| // CHECK: store i32 17, ptr | |
| return 17; | |
| } | |
| // CHECK-LABEL: define{{.*}} nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_Z20lvalue_integral_castv() | |
| const short &lvalue_integral_cast() { | |
| if (i == 0) | |
| // CHECK: store i16 17, ptr | |
| return (const short&)17; | |
| else if (i == 1) | |
| // CHECK: store i16 17, ptr | |
| return static_cast<const short&>(17); | |
| // CHECK: store i16 17, ptr | |
| return 17; | |
| } | |
| // CHECK-LABEL: define{{.*}} nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_Z29lvalue_floating_integral_castv() | |
| const short &lvalue_floating_integral_cast() { | |
| if (i == 0) | |
| // CHECK: store i16 17, ptr | |
| return (const short&)17.5; | |
| else if (i == 1) | |
| // CHECK: store i16 17, ptr | |
| return static_cast<const short&>(17.5); | |
| // CHECK: store i16 17, ptr | |
| return 17.5; | |
| } | |
| // CHECK-LABEL: define{{.*}} nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_Z29lvalue_integral_floating_castv() | |
| const float &lvalue_integral_floating_cast() { | |
| if (i == 0) | |
| // CHECK: store float 1.700000e+{{0*}}1, ptr | |
| return (const float&)17; | |
| else if (i == 1) | |
| // CHECK: store float 1.700000e+{{0*}}1, ptr | |
| return static_cast<const float&>(17); | |
| // CHECK: store float 1.700000e+{{0*}}1, ptr | |
| return 17; | |
| } | |
| // CHECK-LABEL: define{{.*}} nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_Z20lvalue_floating_castv() | |
| const float &lvalue_floating_cast() { | |
| if (i == 0) | |
| // CHECK: store float 1.700000e+{{0*}}1, ptr | |
| return (const float&)17.0; | |
| else if (i == 1) | |
| // CHECK: store float 1.700000e+{{0*}}1, ptr | |
| return static_cast<const float&>(17.0); | |
| // CHECK: store float 1.700000e+{{0*}}1, ptr | |
| return 17.0; | |
| } | |
| int get_int(); | |
| // CHECK-LABEL: define{{.*}} nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_Z24lvalue_integer_bool_castv() | |
| const bool &lvalue_integer_bool_cast() { | |
| if (i == 0) | |
| // CHECK: call noundef i32 @_Z7get_intv() | |
| // CHECK: store i8 | |
| return (const bool&)get_int(); | |
| else if (i == 1) | |
| // CHECK: call noundef i32 @_Z7get_intv() | |
| // CHECK: store i8 | |
| return static_cast<const bool&>(get_int()); | |
| // CHECK: call noundef i32 @_Z7get_intv() | |
| // CHECK: store i8 | |
| return get_int(); | |
| } | |
| float get_float(); | |
| // CHECK-LABEL: define{{.*}} nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_Z25lvalue_floating_bool_castv() | |
| const bool &lvalue_floating_bool_cast() { | |
| if (i == 0) | |
| // CHECK: call noundef float @_Z9get_floatv() | |
| // CHECK: fcmp une float | |
| // CHECK: store i8 | |
| return (const bool&)get_float(); | |
| else if (i == 1) | |
| // CHECK: call noundef float @_Z9get_floatv() | |
| // CHECK: fcmp une float | |
| // CHECK: store i8 | |
| return static_cast<const bool&>(get_float()); | |
| // CHECK: call noundef float @_Z9get_floatv() | |
| // CHECK: fcmp une float | |
| // CHECK: store i8 | |
| return get_float(); | |
| } | |
| struct X { }; | |
| typedef int X::*pm; | |
| typedef int (X::*pmf)(int); | |
| pm get_pointer_to_member_data(); | |
| pmf get_pointer_to_member_function(); | |
| // CHECK-LABEL: define{{.*}} nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_Z26lvalue_ptrmem_to_bool_castv() | |
| const bool &lvalue_ptrmem_to_bool_cast() { | |
| if (i == 0) | |
| // CHECK: call i64 @_Z26get_pointer_to_member_datav() | |
| // CHECK: store i8 | |
| // CHECK: store ptr | |
| return (const bool&)get_pointer_to_member_data(); | |
| else if (i == 1) | |
| // CHECK: call i64 @_Z26get_pointer_to_member_datav() | |
| // CHECK: store i8 | |
| // CHECK: store ptr | |
| return static_cast<const bool&>(get_pointer_to_member_data()); | |
| // CHECK: call i64 @_Z26get_pointer_to_member_datav() | |
| // CHECK: store i8 | |
| // CHECK: store ptr | |
| return get_pointer_to_member_data(); | |
| } | |
| // CHECK-LABEL: define{{.*}} nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_Z27lvalue_ptrmem_to_bool_cast2v | |
| const bool &lvalue_ptrmem_to_bool_cast2() { | |
| if (i == 0) | |
| // CHECK: {{call.*_Z30get_pointer_to_member_functionv}} | |
| // CHECK: store i8 | |
| // CHECK: store ptr | |
| return (const bool&)get_pointer_to_member_function(); | |
| else if (i == 1) | |
| // CHECK: {{call.*_Z30get_pointer_to_member_functionv}} | |
| // CHECK: store i8 | |
| // CHECK: store ptr | |
| return static_cast<const bool&>(get_pointer_to_member_function()); | |
| // CHECK: {{call.*_Z30get_pointer_to_member_functionv}} | |
| // CHECK: store i8 | |
| // CHECK: store ptr | |
| return get_pointer_to_member_function(); | |
| } | |
| _Complex double get_complex_double(); | |
| // CHECK: {{define.*_Z2f1v}} | |
| const _Complex float &f1() { | |
| if (i == 0) | |
| // CHECK: {{call.*_Z18get_complex_doublev}} | |
| // CHECK: fptrunc | |
| // CHECK: fptrunc | |
| // CHECK: store float | |
| // CHECK: store float | |
| return (const _Complex float&)get_complex_double(); | |
| else if (i == 1) | |
| // CHECK: {{call.*_Z18get_complex_doublev}} | |
| // CHECK: fptrunc | |
| // CHECK: fptrunc | |
| // CHECK: store float | |
| // CHECK: store float | |
| return static_cast<const _Complex float&>(get_complex_double()); | |
| // CHECK: {{call.*_Z18get_complex_doublev}} | |
| // CHECK: fptrunc | |
| // CHECK: fptrunc | |
| // CHECK: store float | |
| // CHECK: store float | |
| return get_complex_double(); | |
| } | |
| // CHECK-LABEL: define{{.*}} i32 @_Z7pr10592RKi(ptr | |
| unsigned pr10592(const int &v) { | |
| // CHECK: [[VADDR:%[a-zA-Z0-9.]+]] = alloca ptr | |
| // CHECK-NEXT: [[REFTMP:%[a-zA-Z0-9.]+]] = alloca i32 | |
| // CHECK-NEXT: store ptr [[V:%[a-zA-Z0-9.]+]], ptr [[VADDR]] | |
| // CHECK-NEXT: [[VADDR_1:%[a-zA-Z0-9.]+]] = load ptr, ptr [[VADDR]] | |
| // CHECK-NEXT: [[VVAL:%[a-zA-Z0-9.]+]] = load i32, ptr [[VADDR_1]] | |
| // CHECK-NEXT: store i32 [[VVAL]], ptr [[REFTMP]] | |
| // CHECK-NEXT: [[VVAL_I:%[a-zA-Z0-9.]+]] = load i32, ptr [[REFTMP]] | |
| // CHECK-NEXT: ret i32 [[VVAL_I]] | |
| return static_cast<const unsigned &>(v); | |
| } | |
| namespace PR10650 { | |
| struct Helper { | |
| unsigned long long id(); | |
| }; | |
| unsigned long long test(Helper *obj) { | |
| return static_cast<const unsigned long long&>(obj->id()); | |
| } | |
| // CHECK-LABEL: define{{.*}} i64 @_ZN7PR106504testEPNS_6HelperE | |
| // CHECK: store i64 | |
| } | |
| // CHECK: attributes [[NUW]] = { mustprogress noinline nounwind{{.*}} } |