block-misc.c revision 371f258e61e1365b951b17931a3c5ac1530fd1a0
1// RUN: clang -fsyntax-only -verify %s -fblocks
2void donotwarn();
3
4int (^IFP) ();
5int (^II) (int);
6int test1() {
7	int (^PFR) (int) = 0;	// OK
8	PFR = II;	// OK
9
10	if (PFR == II)	// OK
11	  donotwarn();
12
13	if (PFR == IFP) // expected-error {{comparison of distinct block types}}
14	  donotwarn();
15
16	if (PFR == (int (^) (int))IFP) // OK
17	  donotwarn();
18
19	if (PFR == 0) // OK
20	  donotwarn();
21
22	if (PFR)	// OK
23	  donotwarn();
24
25	if (!PFR)	// OK
26	  donotwarn();
27
28	return PFR != IFP;	// expected-error {{comparison of distinct block types}}
29}
30
31int test2(double (^S)()) {
32   double (^I)(int)  = (void*) S;
33   (void*)I = (void *)S; 	// expected-error {{assignment to cast is illegal, lvalue casts are not supported}}
34
35   void *pv = I;
36
37   pv = S;
38
39   I(1);
40
41   return (void*)I == (void *)S;
42}
43
44int^ x; // expected-error {{block pointer to non-function type is invalid}}
45int^^ x1; // expected-error {{block pointer to non-function type is invalid}}
46
47int test3() {
48	char *^ y; // expected-error {{block pointer to non-function type is invalid}}
49}
50
51
52
53enum {NSBIRLazilyAllocated = 0};
54
55int test4(int argc) {  // rdar://6251437
56  ^{
57    switch (argc) {
58      case NSBIRLazilyAllocated:  // is an integer constant expression.
59      default:
60        break;
61    }
62  }();
63  return 0;
64}
65
66
67// rdar://6257721 - reference to static/global is byref by default.
68static int test5g;
69void test5() {
70  bar(^{ test5g = 1; });
71}
72
73// rdar://6405429 - __func__ in a block refers to the containing function name.
74const char*test6() {
75    return ^{
76        return __func__;
77    } ();
78}
79
80