1 // RUN: %clang_cc1 -fsyntax-only -verify %s -fblocks 2 3 void tovoid(void*); 4 5 void tovoid_test(int (^f)(int, int)) { 6 tovoid(f); 7 } 8 9 void reference_lvalue_test(int& (^f)()) { 10 f() = 10; 11 } 12 13 // PR 7165 14 namespace test1 { 15 void g(void (^)()); 16 struct Foo { 17 void foo(); 18 void test() { 19 (void) ^{ foo(); }; 20 } 21 }; 22 } 23 24 namespace test2 { 25 int repeat(int value, int (^block)(int), unsigned n) { 26 while (n--) value = block(value); 27 return value; 28 } 29 30 class Power { 31 int base; 32 33 public: 34 Power(int base) : base(base) {} 35 int calculate(unsigned n) { 36 return repeat(1, ^(int v) { return v * base; }, n); 37 } 38 }; 39 40 int test() { 41 return Power(2).calculate(10); 42 } 43 } 44 45 // rdar: // 8382559 46 namespace radar8382559 { 47 void func(bool& outHasProperty); 48 49 int test3() { 50 __attribute__((__blocks__(byref))) bool hasProperty = false; 51 bool has = true; 52 53 bool (^b)() = ^ { 54 func(hasProperty); 55 if (hasProperty) 56 hasProperty = 0; 57 if (has) 58 hasProperty = 1; 59 return hasProperty; 60 }; 61 func(hasProperty); 62 func(has); 63 b(); 64 if (hasProperty) 65 hasProperty = 1; 66 if (has) 67 has = 2; 68 return hasProperty = 1; 69 } 70 } 71