2009-12-16 04:14:24 +08:00
|
|
|
// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s
|
2009-11-25 00:43:22 +08:00
|
|
|
void *f();
|
|
|
|
|
|
|
|
template <typename T> T* g() {
|
|
|
|
if (T* t = f())
|
|
|
|
return t;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void h() {
|
|
|
|
void *a = g<void>();
|
|
|
|
}
|
|
|
|
|
|
|
|
struct X {
|
|
|
|
X();
|
|
|
|
~X();
|
|
|
|
operator bool();
|
|
|
|
};
|
|
|
|
|
|
|
|
struct Y {
|
|
|
|
Y();
|
|
|
|
~Y();
|
|
|
|
};
|
|
|
|
|
2010-05-07 01:25:47 +08:00
|
|
|
X getX();
|
|
|
|
|
2009-11-25 00:43:22 +08:00
|
|
|
void if_destruct(int z) {
|
|
|
|
// Verify that the condition variable is destroyed at the end of the
|
|
|
|
// "if" statement.
|
|
|
|
// CHECK: call void @_ZN1XC1Ev
|
|
|
|
// CHECK: call zeroext i1 @_ZN1XcvbEv
|
|
|
|
if (X x = X()) {
|
|
|
|
// CHECK: store i32 18
|
|
|
|
z = 18;
|
|
|
|
}
|
|
|
|
// CHECK: call void @_ZN1XD1Ev
|
|
|
|
// CHECK: store i32 17
|
|
|
|
z = 17;
|
|
|
|
|
|
|
|
// CHECK: call void @_ZN1XC1Ev
|
|
|
|
if (X x = X())
|
|
|
|
Y y;
|
2010-01-14 04:57:29 +08:00
|
|
|
// CHECK: br
|
2009-11-25 00:43:22 +08:00
|
|
|
// CHECK: call void @_ZN1YC1Ev
|
|
|
|
// CHECK: call void @_ZN1YD1Ev
|
2010-01-14 04:57:29 +08:00
|
|
|
// CHECK: br
|
2009-11-25 00:43:22 +08:00
|
|
|
// CHECK: call void @_ZN1XD1Ev
|
2010-05-07 01:25:47 +08:00
|
|
|
|
|
|
|
// CHECK: call void @_Z4getXv
|
|
|
|
// CHECK: call zeroext i1 @_ZN1XcvbEv
|
|
|
|
// CHECK: call void @_ZN1XD1Ev
|
|
|
|
// CHECK: br
|
|
|
|
if (getX()) { }
|
|
|
|
|
|
|
|
// CHECK: ret
|
2009-11-25 00:43:22 +08:00
|
|
|
}
|
2009-11-25 01:07:59 +08:00
|
|
|
|
|
|
|
struct ConvertibleToInt {
|
|
|
|
ConvertibleToInt();
|
|
|
|
~ConvertibleToInt();
|
|
|
|
operator int();
|
|
|
|
};
|
|
|
|
|
2010-05-07 01:25:47 +08:00
|
|
|
ConvertibleToInt getConvToInt();
|
|
|
|
|
2009-11-25 01:07:59 +08:00
|
|
|
void switch_destruct(int z) {
|
|
|
|
// CHECK: call void @_ZN16ConvertibleToIntC1Ev
|
|
|
|
switch (ConvertibleToInt conv = ConvertibleToInt()) {
|
|
|
|
case 0:
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
2010-05-09 00:04:01 +08:00
|
|
|
// CHECK: {{sw.default:|:5}}
|
2009-11-25 01:07:59 +08:00
|
|
|
// CHECK: store i32 19
|
|
|
|
z = 19;
|
|
|
|
break;
|
|
|
|
}
|
2010-05-09 00:04:01 +08:00
|
|
|
// CHECK: {{sw.epilog:|:6}}
|
2009-11-25 01:07:59 +08:00
|
|
|
// CHECK: call void @_ZN16ConvertibleToIntD1Ev
|
|
|
|
// CHECK: store i32 20
|
|
|
|
z = 20;
|
2010-05-07 01:25:47 +08:00
|
|
|
|
|
|
|
// CHECK: call void @_Z12getConvToIntv
|
|
|
|
// CHECK: call i32 @_ZN16ConvertibleToIntcviEv
|
|
|
|
// CHECK: call void @_ZN16ConvertibleToIntD1Ev
|
|
|
|
switch(getConvToInt()) {
|
|
|
|
case 0:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
// CHECK: store i32 27
|
|
|
|
z = 27;
|
|
|
|
// CHECK: ret
|
2009-11-25 01:07:59 +08:00
|
|
|
}
|
2009-11-25 05:15:44 +08:00
|
|
|
|
|
|
|
int foo();
|
|
|
|
|
|
|
|
void while_destruct(int z) {
|
|
|
|
// CHECK: define void @_Z14while_destructi
|
2010-05-09 00:04:01 +08:00
|
|
|
// CHECK: {{while.cond:|:3}}
|
2009-11-25 05:15:44 +08:00
|
|
|
while (X x = X()) {
|
|
|
|
// CHECK: call void @_ZN1XC1Ev
|
|
|
|
|
2010-05-09 00:04:01 +08:00
|
|
|
// CHECK: {{while.body:|:5}}
|
2009-11-25 05:15:44 +08:00
|
|
|
// CHECK: store i32 21
|
|
|
|
z = 21;
|
|
|
|
|
2010-05-09 00:04:01 +08:00
|
|
|
// CHECK: {{while.cleanup:|:6}}
|
2009-11-25 05:15:44 +08:00
|
|
|
// CHECK: call void @_ZN1XD1Ev
|
|
|
|
}
|
2010-05-09 00:04:01 +08:00
|
|
|
// CHECK: {{while.end|:8}}
|
2009-11-25 05:15:44 +08:00
|
|
|
// CHECK: store i32 22
|
|
|
|
z = 22;
|
2010-05-07 01:25:47 +08:00
|
|
|
|
|
|
|
// CHECK: call void @_Z4getXv
|
|
|
|
// CHECK: call zeroext i1 @_ZN1XcvbEv
|
|
|
|
// CHECK: call void @_ZN1XD1Ev
|
|
|
|
// CHECK: br
|
|
|
|
while(getX()) { }
|
|
|
|
|
|
|
|
// CHECK: store i32 25
|
|
|
|
z = 25;
|
|
|
|
|
|
|
|
// CHECK: ret
|
2009-11-25 05:15:44 +08:00
|
|
|
}
|
2009-11-25 08:27:52 +08:00
|
|
|
|
|
|
|
void for_destruct(int z) {
|
|
|
|
// CHECK: define void @_Z12for_destruct
|
2009-11-25 08:29:29 +08:00
|
|
|
// CHECK: call void @_ZN1YC1Ev
|
|
|
|
for(Y y = Y(); X x = X(); ++z)
|
2010-05-09 00:04:01 +08:00
|
|
|
// CHECK: {{for.cond:|:4}}
|
2009-11-25 09:51:31 +08:00
|
|
|
// CHECK: call void @_ZN1XC1Ev
|
2010-05-09 00:04:01 +08:00
|
|
|
// CHECK: {{for.body:|:6}}
|
2009-11-25 08:27:52 +08:00
|
|
|
// CHECK: store i32 23
|
|
|
|
z = 23;
|
2010-05-09 00:04:01 +08:00
|
|
|
// CHECK: {{for.inc:|:7}}
|
|
|
|
// CHECK: br label %{{for.cond.cleanup|10}}
|
|
|
|
// CHECK: {{for.cond.cleanup:|:10}}
|
2009-11-25 09:51:31 +08:00
|
|
|
// CHECK: call void @_ZN1XD1Ev
|
2010-05-09 00:04:01 +08:00
|
|
|
// CHECK: {{for.end:|:12}}
|
2009-11-25 08:29:29 +08:00
|
|
|
// CHECK: call void @_ZN1YD1Ev
|
2009-11-25 08:27:52 +08:00
|
|
|
// CHECK: store i32 24
|
|
|
|
z = 24;
|
2010-05-07 01:25:47 +08:00
|
|
|
|
|
|
|
// CHECK: call void @_Z4getXv
|
|
|
|
// CHECK: call zeroext i1 @_ZN1XcvbEv
|
|
|
|
// CHECK: call void @_ZN1XD1Ev
|
|
|
|
// CHECK: br
|
|
|
|
// CHECK: call void @_Z4getXv
|
|
|
|
// CHECK: load
|
|
|
|
// CHECK: add
|
|
|
|
// CHECK: call void @_ZN1XD1Ev
|
|
|
|
int i = 0;
|
|
|
|
for(; getX(); getX(), ++i) { }
|
|
|
|
z = 26;
|
|
|
|
// CHECK: store i32 26
|
|
|
|
// CHECK: ret
|
|
|
|
}
|
|
|
|
|
|
|
|
void do_destruct(int z) {
|
|
|
|
// CHECK: define void @_Z11do_destruct
|
|
|
|
do {
|
|
|
|
// CHECK: store i32 77
|
|
|
|
z = 77;
|
|
|
|
// CHECK: call void @_Z4getXv
|
|
|
|
// CHECK: call zeroext i1 @_ZN1XcvbEv
|
|
|
|
// CHECK: call void @_ZN1XD1Ev
|
|
|
|
// CHECK: br
|
|
|
|
} while (getX());
|
|
|
|
// CHECK: store i32 99
|
|
|
|
z = 99;
|
|
|
|
// CHECK: ret
|
2009-11-25 08:27:52 +08:00
|
|
|
}
|