17c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor// RUN: %clang_cc1 -emit-llvm -triple x86_64-apple-darwin10 -o - %s | FileCheck %s 27c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor 37c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor// PR6024 47c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregorextern int i; 57c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor 6ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK: define nonnull i32* @_Z16lvalue_noop_castv() [[NUW:#[0-9]+]] 77c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregorconst int &lvalue_noop_cast() { 87c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor if (i == 0) 97c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store i32 17, i32* 107c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return (const int&)17; 117c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor else if (i == 1) 127c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store i32 17, i32* 137c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return static_cast<const int&>(17); 147c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store i32 17, i32* 157c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return 17; 167c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor} 177c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor 18ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-LABEL: define nonnull i16* @_Z20lvalue_integral_castv() 197c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregorconst short &lvalue_integral_cast() { 207c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor if (i == 0) 217c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store i16 17, i16* 227c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return (const short&)17; 237c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor else if (i == 1) 247c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store i16 17, i16* 257c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return static_cast<const short&>(17); 267c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store i16 17, i16* 277c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return 17; 287c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor} 297c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor 30ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-LABEL: define nonnull i16* @_Z29lvalue_floating_integral_castv() 317c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregorconst short &lvalue_floating_integral_cast() { 327c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor if (i == 0) 337c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store i16 17, i16* 347c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return (const short&)17.5; 357c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor else if (i == 1) 367c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store i16 17, i16* 377c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return static_cast<const short&>(17.5); 387c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store i16 17, i16* 397c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return 17.5; 407c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor} 417c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor 42ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-LABEL: define nonnull float* @_Z29lvalue_integral_floating_castv() 437c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregorconst float &lvalue_integral_floating_cast() { 447c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor if (i == 0) 452b02f7a051b092ebbae436026565fee52683972fBenjamin Kramer // CHECK: store float 1.700000e+{{0*}}1, float* 467c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return (const float&)17; 477c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor else if (i == 1) 482b02f7a051b092ebbae436026565fee52683972fBenjamin Kramer // CHECK: store float 1.700000e+{{0*}}1, float* 497c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return static_cast<const float&>(17); 502b02f7a051b092ebbae436026565fee52683972fBenjamin Kramer // CHECK: store float 1.700000e+{{0*}}1, float* 517c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return 17; 527c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor} 537c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor 54ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-LABEL: define nonnull float* @_Z20lvalue_floating_castv() 557c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregorconst float &lvalue_floating_cast() { 567c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor if (i == 0) 572b02f7a051b092ebbae436026565fee52683972fBenjamin Kramer // CHECK: store float 1.700000e+{{0*}}1, float* 587c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return (const float&)17.0; 597c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor else if (i == 1) 602b02f7a051b092ebbae436026565fee52683972fBenjamin Kramer // CHECK: store float 1.700000e+{{0*}}1, float* 617c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return static_cast<const float&>(17.0); 622b02f7a051b092ebbae436026565fee52683972fBenjamin Kramer // CHECK: store float 1.700000e+{{0*}}1, float* 637c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return 17.0; 647c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor} 657c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor 667c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregorint get_int(); 677c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor 68ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-LABEL: define nonnull i8* @_Z24lvalue_integer_bool_castv() 697c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregorconst bool &lvalue_integer_bool_cast() { 707c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor if (i == 0) 717c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: call i32 @_Z7get_intv() 727c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store i8 737c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return (const bool&)get_int(); 747c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor else if (i == 1) 757c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: call i32 @_Z7get_intv() 767c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store i8 777c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return static_cast<const bool&>(get_int()); 787c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: call i32 @_Z7get_intv() 797c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store i8 807c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return get_int(); 817c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor} 827c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor 837c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregorfloat get_float(); 847c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor 85ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-LABEL: define nonnull i8* @_Z25lvalue_floating_bool_castv() 867c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregorconst bool &lvalue_floating_bool_cast() { 877c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor if (i == 0) 887c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: call float @_Z9get_floatv() 897c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: fcmp une float 907c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store i8 917c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return (const bool&)get_float(); 927c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor else if (i == 1) 937c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: call float @_Z9get_floatv() 947c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: fcmp une float 957c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store i8 967c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return static_cast<const bool&>(get_float()); 977c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: call float @_Z9get_floatv() 987c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: fcmp une float 997c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store i8 1007c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return get_float(); 1017c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor} 1027c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor 1037c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregorstruct X { }; 1047c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregortypedef int X::*pm; 1057c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregortypedef int (X::*pmf)(int); 1067c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor 1077c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregorpm get_pointer_to_member_data(); 1087c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregorpmf get_pointer_to_member_function(); 1097c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor 110ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-LABEL: define nonnull i8* @_Z26lvalue_ptrmem_to_bool_castv() 1117c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregorconst bool &lvalue_ptrmem_to_bool_cast() { 1127c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor if (i == 0) 1137c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: call i64 @_Z26get_pointer_to_member_datav() 1147c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store i8 1157c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store i8* 1167c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return (const bool&)get_pointer_to_member_data(); 1177c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor else if (i == 1) 1187c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: call i64 @_Z26get_pointer_to_member_datav() 1197c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store i8 1207c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store i8* 1217c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return static_cast<const bool&>(get_pointer_to_member_data()); 1227c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: call i64 @_Z26get_pointer_to_member_datav() 1237c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store i8 1247c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store i8* 1257c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return get_pointer_to_member_data(); 1267c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor} 1277c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor 128ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-LABEL: define nonnull i8* @_Z27lvalue_ptrmem_to_bool_cast2v 1297c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregorconst bool &lvalue_ptrmem_to_bool_cast2() { 1307c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor if (i == 0) 1317c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: {{call.*_Z30get_pointer_to_member_functionv}} 1327c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store i8 1337c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store i8* 1347c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return (const bool&)get_pointer_to_member_function(); 1357c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor else if (i == 1) 1367c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: {{call.*_Z30get_pointer_to_member_functionv}} 1377c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store i8 1387c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store i8* 1397c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return static_cast<const bool&>(get_pointer_to_member_function()); 1407c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: {{call.*_Z30get_pointer_to_member_functionv}} 1417c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store i8 1427c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store i8* 1437c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return get_pointer_to_member_function(); 1447c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor} 1457c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor 1467c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor_Complex double get_complex_double(); 1477c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor 1487c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor// CHECK: {{define.*_Z2f1v}} 1497c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregorconst _Complex float &f1() { 1507c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor if (i == 0) 1517c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: {{call.*_Z18get_complex_doublev}} 1527c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: fptrunc 1537c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: fptrunc 1547c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store float 1557c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store float 1567c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return (const _Complex float&)get_complex_double(); 1577c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor else if (i == 1) 1587c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: {{call.*_Z18get_complex_doublev}} 1597c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: fptrunc 1607c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: fptrunc 1617c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store float 1627c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store float 1637c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return static_cast<const _Complex float&>(get_complex_double()); 1647c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: {{call.*_Z18get_complex_doublev}} 1657c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: fptrunc 1667c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: fptrunc 1677c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store float 1687c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor // CHECK: store float 1697c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor return get_complex_double(); 1707c7a79303b62f51c1ff02f9ce41d81211a69d3b4Douglas Gregor} 1713f86ce1dc64a46d9cd3675787b8af32c9158abe6Douglas Gregor 17293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define i32 @_Z7pr10592RKi(i32* 1733f86ce1dc64a46d9cd3675787b8af32c9158abe6Douglas Gregorunsigned pr10592(const int &v) { 1743f86ce1dc64a46d9cd3675787b8af32c9158abe6Douglas Gregor // CHECK: [[VADDR:%[a-zA-Z0-9.]+]] = alloca i32* 1753f86ce1dc64a46d9cd3675787b8af32c9158abe6Douglas Gregor // CHECK-NEXT: [[REFTMP:%[a-zA-Z0-9.]+]] = alloca i32 1763f86ce1dc64a46d9cd3675787b8af32c9158abe6Douglas Gregor // CHECK-NEXT: store i32* [[V:%[a-zA-Z0-9.]+]], i32** [[VADDR]] 1773f86ce1dc64a46d9cd3675787b8af32c9158abe6Douglas Gregor // CHECK-NEXT: [[VADDR_1:%[a-zA-Z0-9.]+]] = load i32** [[VADDR]] 1783f86ce1dc64a46d9cd3675787b8af32c9158abe6Douglas Gregor // CHECK-NEXT: [[VVAL:%[a-zA-Z0-9.]+]] = load i32* [[VADDR_1]] 1793f86ce1dc64a46d9cd3675787b8af32c9158abe6Douglas Gregor // CHECK-NEXT: store i32 [[VVAL]], i32* [[REFTMP]] 1803f86ce1dc64a46d9cd3675787b8af32c9158abe6Douglas Gregor // CHECK-NEXT: [[VVAL_I:%[a-zA-Z0-9.]+]] = load i32* [[REFTMP]] 1813f86ce1dc64a46d9cd3675787b8af32c9158abe6Douglas Gregor // CHECK-NEXT: ret i32 [[VVAL_I]] 1823f86ce1dc64a46d9cd3675787b8af32c9158abe6Douglas Gregor return static_cast<const unsigned &>(v); 1833f86ce1dc64a46d9cd3675787b8af32c9158abe6Douglas Gregor} 184ec24b0ed9ccf8b34986eadeb98dd0b4a0a50f6f2Eli Friedman 185ec24b0ed9ccf8b34986eadeb98dd0b4a0a50f6f2Eli Friedmannamespace PR10650 { 186ec24b0ed9ccf8b34986eadeb98dd0b4a0a50f6f2Eli Friedman struct Helper { 187ec24b0ed9ccf8b34986eadeb98dd0b4a0a50f6f2Eli Friedman unsigned long long id(); 188ec24b0ed9ccf8b34986eadeb98dd0b4a0a50f6f2Eli Friedman }; 189ec24b0ed9ccf8b34986eadeb98dd0b4a0a50f6f2Eli Friedman unsigned long long test(Helper *obj) { 190ec24b0ed9ccf8b34986eadeb98dd0b4a0a50f6f2Eli Friedman return static_cast<const unsigned long long&>(obj->id()); 191ec24b0ed9ccf8b34986eadeb98dd0b4a0a50f6f2Eli Friedman } 19293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define i64 @_ZN7PR106504testEPNS_6HelperE 193ec24b0ed9ccf8b34986eadeb98dd0b4a0a50f6f2Eli Friedman // CHECK: store i64 194ec24b0ed9ccf8b34986eadeb98dd0b4a0a50f6f2Eli Friedman} 195f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling 196be9e8bfef6ee7f81ea30e9d358101b4f8d560c6bBill Wendling// CHECK: attributes [[NUW]] = { nounwind{{.*}} } 197