condition.cpp revision e5712b1341ecae8901ca26f1bdfac2a281958209
1// RUN: %clang_cc1 -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: br 43 // CHECK: call void @_ZN1YC1Ev 44 // CHECK: call void @_ZN1YD1Ev 45 // CHECK: br 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:|:3}} 63 // CHECK: store i32 19 64 z = 19; 65 break; 66 } 67 // CHECK: {{sw.epilog:|:5}} 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:|:2}} 78 while (X x = X()) { 79 // CHECK: call void @_ZN1XC1Ev 80 81 // CHECK: {{while.body:|:4}} 82 // CHECK: store i32 21 83 z = 21; 84 85 // CHECK: {{while.cleanup:|:5}} 86 // CHECK: call void @_ZN1XD1Ev 87 } 88 // CHECK: {{while.end|:7}} 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 @_ZN1YC1Ev 96 for(Y y = Y(); X x = X(); ++z) 97 // CHECK: {{for.cond:|:2}} 98 // CHECK: call void @_ZN1XC1Ev 99 // CHECK: {{for.body:|:4}} 100 // CHECK: store i32 23 101 z = 23; 102 // CHECK: {{for.inc:|:5}} 103 // CHECK: br label %{{for.cond.cleanup|8}} 104 // CHECK: {{for.cond.cleanup:|:8}} 105 // CHECK: call void @_ZN1XD1Ev 106 // CHECK: {{for.end:|:10}} 107 // CHECK: call void @_ZN1YD1Ev 108 // CHECK: store i32 24 109 z = 24; 110} 111