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