condition.cpp revision 99e9b4d172f6877e6ba5ebe75bb8238721f5e01c
1// RUN: clang-cc -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s 2void *f(); 3 4template <typename T> T* g() { 5 if (T* t = f()) 6 return t; 7 8 return 0; 9} 10 11void h() { 12 void *a = g<void>(); 13} 14 15struct X { 16 X(); 17 ~X(); 18 operator bool(); 19}; 20 21struct Y { 22 Y(); 23 ~Y(); 24}; 25 26void if_destruct(int z) { 27 // Verify that the condition variable is destroyed at the end of the 28 // "if" statement. 29 // CHECK: call void @_ZN1XC1Ev 30 // CHECK: call zeroext i1 @_ZN1XcvbEv 31 if (X x = X()) { 32 // CHECK: store i32 18 33 z = 18; 34 } 35 // CHECK: call void @_ZN1XD1Ev 36 // CHECK: store i32 17 37 z = 17; 38 39 // CHECK: call void @_ZN1XC1Ev 40 if (X x = X()) 41 Y y; 42 // CHECK: if.then 43 // CHECK: call void @_ZN1YC1Ev 44 // CHECK: call void @_ZN1YD1Ev 45 // CHECK: if.end 46 // CHECK: call void @_ZN1XD1Ev 47} 48 49struct ConvertibleToInt { 50 ConvertibleToInt(); 51 ~ConvertibleToInt(); 52 operator int(); 53}; 54 55void switch_destruct(int z) { 56 // CHECK: call void @_ZN16ConvertibleToIntC1Ev 57 switch (ConvertibleToInt conv = ConvertibleToInt()) { 58 case 0: 59 break; 60 61 default: 62 // CHECK: sw.default: 63 // CHECK: store i32 19 64 z = 19; 65 break; 66 } 67 // CHECK: sw.epilog: 68 // CHECK: call void @_ZN16ConvertibleToIntD1Ev 69 // CHECK: store i32 20 70 z = 20; 71} 72 73int foo(); 74 75void while_destruct(int z) { 76 // CHECK: define void @_Z14while_destructi 77 // CHECK: while.cond: 78 while (X x = X()) { 79 // CHECK: call void @_ZN1XC1Ev 80 81 // CHECK: while.body: 82 // CHECK: store i32 21 83 z = 21; 84 85 // CHECK: while.cleanup: 86 // CHECK: call void @_ZN1XD1Ev 87 } 88 // CHECK: while.end 89 // CHECK: store i32 22 90 z = 22; 91} 92 93void for_destruct(int z) { 94 // CHECK: define void @_Z12for_destruct 95 // CHECK: call void @_ZN1XC1Ev 96 for(X x = X(); z; ++z) 97 // CHECK: for.body: 98 // CHECK: store i32 23 99 z = 23; 100 // CHECK: for.inc: 101 // CHECK: for.end 102 // CHECK: call void @_ZN1XD1Ev 103 // CHECK: store i32 24 104 z = 24; 105} 106