// rdar://8594790 #if defined(__BLOCKS__) && defined(__clang__) #include extern "C" void abort(); static int count=0; class A { public: int x; A(const A &o) { ++count; x = o.x; if (this == &o) abort(); } A &operator =(const A &o) { x = o.x; return *this; } A() : x(100) { ++count; } ~A(); void hello() const { if (x != 100) abort(); } }; A::~A() { --count; if (x != 100) abort(); x = 0; } #endif int main() { #if defined(__BLOCKS__) && defined(__clang__) if (!count) { __block A a; A ca; void (^b)(void) = Block_copy(^{ a.hello(); ca.hello(); }); b(); Block_release(b); } if (count) abort(); #endif return 0; }