annotate clang/test/Sema/block-misc.c @ 207:2e18cbf3894f

LLVM12
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 08 Jun 2021 06:07:14 +0900
parents 1d019706d866
children c4bab56944e8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 // RUN: %clang_cc1 -fsyntax-only -verify %s -fblocks
anatofuz
parents:
diff changeset
2 void donotwarn();
anatofuz
parents:
diff changeset
3
anatofuz
parents:
diff changeset
4 int (^IFP) ();
anatofuz
parents:
diff changeset
5 int (^II) (int);
anatofuz
parents:
diff changeset
6 int test1() {
anatofuz
parents:
diff changeset
7 int (^PFR) (int) = 0; // OK
anatofuz
parents:
diff changeset
8 PFR = II; // OK
anatofuz
parents:
diff changeset
9
anatofuz
parents:
diff changeset
10 if (PFR == II) // OK
anatofuz
parents:
diff changeset
11 donotwarn();
anatofuz
parents:
diff changeset
12
anatofuz
parents:
diff changeset
13 if (PFR == IFP) // OK
anatofuz
parents:
diff changeset
14 donotwarn();
anatofuz
parents:
diff changeset
15
anatofuz
parents:
diff changeset
16 if (PFR == (int (^) (int))IFP) // OK
anatofuz
parents:
diff changeset
17 donotwarn();
anatofuz
parents:
diff changeset
18
anatofuz
parents:
diff changeset
19 if (PFR == 0) // OK
anatofuz
parents:
diff changeset
20 donotwarn();
anatofuz
parents:
diff changeset
21
anatofuz
parents:
diff changeset
22 if (PFR) // OK
anatofuz
parents:
diff changeset
23 donotwarn();
anatofuz
parents:
diff changeset
24
anatofuz
parents:
diff changeset
25 if (!PFR) // OK
anatofuz
parents:
diff changeset
26 donotwarn();
anatofuz
parents:
diff changeset
27
anatofuz
parents:
diff changeset
28 return PFR != IFP; // OK
anatofuz
parents:
diff changeset
29 }
anatofuz
parents:
diff changeset
30
anatofuz
parents:
diff changeset
31 int test2(double (^S)()) {
anatofuz
parents:
diff changeset
32 double (^I)(int) = (void*) S;
anatofuz
parents:
diff changeset
33 (void*)I = (void *)S; // expected-error {{assignment to cast is illegal, lvalue casts are not supported}}
anatofuz
parents:
diff changeset
34
anatofuz
parents:
diff changeset
35 void *pv = I;
anatofuz
parents:
diff changeset
36
anatofuz
parents:
diff changeset
37 pv = S;
anatofuz
parents:
diff changeset
38
anatofuz
parents:
diff changeset
39 I(1);
anatofuz
parents:
diff changeset
40
anatofuz
parents:
diff changeset
41 return (void*)I == (void *)S;
anatofuz
parents:
diff changeset
42 }
anatofuz
parents:
diff changeset
43
anatofuz
parents:
diff changeset
44 int^ x; // expected-error {{block pointer to non-function type is invalid}}
anatofuz
parents:
diff changeset
45 int^^ x1; // expected-error {{block pointer to non-function type is invalid}} expected-error {{block pointer to non-function type is invalid}}
anatofuz
parents:
diff changeset
46
anatofuz
parents:
diff changeset
47 void test3() {
anatofuz
parents:
diff changeset
48 char *^ y; // expected-error {{block pointer to non-function type is invalid}}
anatofuz
parents:
diff changeset
49 }
anatofuz
parents:
diff changeset
50
anatofuz
parents:
diff changeset
51
anatofuz
parents:
diff changeset
52
anatofuz
parents:
diff changeset
53 enum {NSBIRLazilyAllocated = 0};
anatofuz
parents:
diff changeset
54
anatofuz
parents:
diff changeset
55 int test4(int argc) { // rdar://6251437
anatofuz
parents:
diff changeset
56 ^{
anatofuz
parents:
diff changeset
57 switch (argc) {
anatofuz
parents:
diff changeset
58 case NSBIRLazilyAllocated: // is an integer constant expression.
anatofuz
parents:
diff changeset
59 default:
anatofuz
parents:
diff changeset
60 break;
anatofuz
parents:
diff changeset
61 }
anatofuz
parents:
diff changeset
62 }();
anatofuz
parents:
diff changeset
63 return 0;
anatofuz
parents:
diff changeset
64 }
anatofuz
parents:
diff changeset
65
anatofuz
parents:
diff changeset
66
anatofuz
parents:
diff changeset
67 void bar(void*);
anatofuz
parents:
diff changeset
68 // rdar://6257721 - reference to static/global is byref by default.
anatofuz
parents:
diff changeset
69 static int test5g;
anatofuz
parents:
diff changeset
70 void test5() {
anatofuz
parents:
diff changeset
71 bar(^{ test5g = 1; });
anatofuz
parents:
diff changeset
72 }
anatofuz
parents:
diff changeset
73
anatofuz
parents:
diff changeset
74 // rdar://6405429 - __func__ in a block refers to the containing function name.
anatofuz
parents:
diff changeset
75 const char*test6() {
anatofuz
parents:
diff changeset
76 return ^{
anatofuz
parents:
diff changeset
77 return __func__;
anatofuz
parents:
diff changeset
78 } ();
anatofuz
parents:
diff changeset
79 }
anatofuz
parents:
diff changeset
80
anatofuz
parents:
diff changeset
81 // radr://6732116 - block comparisons
anatofuz
parents:
diff changeset
82 void (^test7a)();
anatofuz
parents:
diff changeset
83 int test7(void (^p)()) {
anatofuz
parents:
diff changeset
84 return test7a == p;
anatofuz
parents:
diff changeset
85 }
anatofuz
parents:
diff changeset
86
anatofuz
parents:
diff changeset
87
anatofuz
parents:
diff changeset
88 void test8() {
anatofuz
parents:
diff changeset
89 somelabel:
anatofuz
parents:
diff changeset
90 ^{ goto somelabel; }(); // expected-error {{use of undeclared label 'somelabel'}}
anatofuz
parents:
diff changeset
91 }
anatofuz
parents:
diff changeset
92
anatofuz
parents:
diff changeset
93 void test9() {
anatofuz
parents:
diff changeset
94 goto somelabel; // expected-error {{use of undeclared label 'somelabel'}}
anatofuz
parents:
diff changeset
95 ^{ somelabel: ; }();
anatofuz
parents:
diff changeset
96 }
anatofuz
parents:
diff changeset
97
anatofuz
parents:
diff changeset
98 void test10(int i) {
anatofuz
parents:
diff changeset
99 switch (i) {
anatofuz
parents:
diff changeset
100 case 41: ;
anatofuz
parents:
diff changeset
101 ^{ case 42: ; }(); // expected-error {{'case' statement not in switch statement}}
anatofuz
parents:
diff changeset
102 }
anatofuz
parents:
diff changeset
103 }
anatofuz
parents:
diff changeset
104
anatofuz
parents:
diff changeset
105 void test11(int i) {
anatofuz
parents:
diff changeset
106 switch (i) {
anatofuz
parents:
diff changeset
107 case 41: ;
anatofuz
parents:
diff changeset
108 ^{ break; }(); // expected-error {{'break' statement not in loop or switch statement}}
anatofuz
parents:
diff changeset
109 }
anatofuz
parents:
diff changeset
110
anatofuz
parents:
diff changeset
111 for (; i < 100; ++i)
anatofuz
parents:
diff changeset
112 ^{ break; }(); // expected-error {{'break' statement not in loop or switch statement}}
anatofuz
parents:
diff changeset
113 }
anatofuz
parents:
diff changeset
114
anatofuz
parents:
diff changeset
115 void (^test12f)(void);
anatofuz
parents:
diff changeset
116 void test12() {
anatofuz
parents:
diff changeset
117 test12f = ^test12f; // expected-error {{type name requires a specifier or qualifier}} expected-error {{expected expression}}
anatofuz
parents:
diff changeset
118 }
anatofuz
parents:
diff changeset
119
anatofuz
parents:
diff changeset
120 // rdar://6808730
anatofuz
parents:
diff changeset
121 void *test13 = ^{
anatofuz
parents:
diff changeset
122 int X = 32;
anatofuz
parents:
diff changeset
123
anatofuz
parents:
diff changeset
124 void *P = ^{
anatofuz
parents:
diff changeset
125 return X+4; // References outer block's "X", so outer block is constant.
anatofuz
parents:
diff changeset
126 };
anatofuz
parents:
diff changeset
127 };
anatofuz
parents:
diff changeset
128
anatofuz
parents:
diff changeset
129 void test14() {
anatofuz
parents:
diff changeset
130 int X = 32;
anatofuz
parents:
diff changeset
131 static void *P = ^{ // expected-error {{initializer element is not a compile-time constant}}
anatofuz
parents:
diff changeset
132
anatofuz
parents:
diff changeset
133 void *Q = ^{
anatofuz
parents:
diff changeset
134 // References test14's "X": outer block is non-constant.
anatofuz
parents:
diff changeset
135 return X+4;
anatofuz
parents:
diff changeset
136 };
anatofuz
parents:
diff changeset
137 };
anatofuz
parents:
diff changeset
138 }
anatofuz
parents:
diff changeset
139
anatofuz
parents:
diff changeset
140 enum { LESS };
anatofuz
parents:
diff changeset
141
anatofuz
parents:
diff changeset
142 void foo(long (^comp)()) { // expected-note{{passing argument to parameter 'comp' here}}
anatofuz
parents:
diff changeset
143 }
anatofuz
parents:
diff changeset
144
anatofuz
parents:
diff changeset
145 void (^test15f)(void);
anatofuz
parents:
diff changeset
146 void test15() {
anatofuz
parents:
diff changeset
147 foo(^{ return LESS; }); // expected-error {{incompatible block pointer types passing 'int (^)(void)' to parameter of type 'long (^)()'}}
anatofuz
parents:
diff changeset
148 }
anatofuz
parents:
diff changeset
149
anatofuz
parents:
diff changeset
150 __block int test16i; // expected-error {{__block attribute not allowed, only allowed on local variables}}
anatofuz
parents:
diff changeset
151
anatofuz
parents:
diff changeset
152 void test16(__block int i) { // expected-error {{__block attribute not allowed, only allowed on local variables}}
anatofuz
parents:
diff changeset
153 int size = 5;
anatofuz
parents:
diff changeset
154 extern __block double extern_var; // expected-error {{__block attribute not allowed, only allowed on local variables}}
anatofuz
parents:
diff changeset
155 static __block char * pch; // expected-error {{__block attribute not allowed, only allowed on local variables}}
anatofuz
parents:
diff changeset
156 __block int a[size]; // expected-error {{__block attribute not allowed on declaration with a variably modified type}}
anatofuz
parents:
diff changeset
157 __block int (*ap)[size]; // expected-error {{__block attribute not allowed on declaration with a variably modified type}}
anatofuz
parents:
diff changeset
158 }
anatofuz
parents:
diff changeset
159
anatofuz
parents:
diff changeset
160 void f();
anatofuz
parents:
diff changeset
161
anatofuz
parents:
diff changeset
162 void test17() {
anatofuz
parents:
diff changeset
163 void (^bp)(int);
anatofuz
parents:
diff changeset
164 void (*rp)(int);
anatofuz
parents:
diff changeset
165 void (^bp1)();
anatofuz
parents:
diff changeset
166 void *vp = bp;
anatofuz
parents:
diff changeset
167
anatofuz
parents:
diff changeset
168 f(1 ? bp : vp);
anatofuz
parents:
diff changeset
169 f(1 ? vp : bp);
anatofuz
parents:
diff changeset
170 f(1 ? bp : bp1);
anatofuz
parents:
diff changeset
171 (void)(bp > rp); // expected-error {{invalid operands}}
anatofuz
parents:
diff changeset
172 (void)(bp > 0); // expected-error {{invalid operands}}
anatofuz
parents:
diff changeset
173 (void)(bp > bp); // expected-error {{invalid operands}}
anatofuz
parents:
diff changeset
174 (void)(bp > vp); // expected-error {{invalid operands}}
anatofuz
parents:
diff changeset
175 f(1 ? bp : rp); // expected-error {{incompatible operand types ('void (^)(int)' and 'void (*)(int)')}}
anatofuz
parents:
diff changeset
176 (void)(bp == 1); // expected-error {{invalid operands to binary expression}}
anatofuz
parents:
diff changeset
177 (void)(bp == 0);
anatofuz
parents:
diff changeset
178 (void)(1 == bp); // expected-error {{invalid operands to binary expression}}
anatofuz
parents:
diff changeset
179 (void)(0 == bp);
anatofuz
parents:
diff changeset
180 (void)(bp < 1); // expected-error {{invalid operands to binary expression}}
anatofuz
parents:
diff changeset
181 (void)(bp < 0); // expected-error {{invalid operands to binary expression}}
anatofuz
parents:
diff changeset
182 (void)(1 < bp); // expected-error {{invalid operands to binary expression}}
anatofuz
parents:
diff changeset
183 (void)(0 < bp); // expected-error {{invalid operands to binary expression}}
anatofuz
parents:
diff changeset
184 }
anatofuz
parents:
diff changeset
185
anatofuz
parents:
diff changeset
186 void test18() {
anatofuz
parents:
diff changeset
187 void (^const blockA)(void) = ^{ }; // expected-note {{variable 'blockA' declared const here}}
anatofuz
parents:
diff changeset
188 blockA = ^{ }; // expected-error {{cannot assign to variable 'blockA' with const-qualified type 'void (^const)(void)}}
anatofuz
parents:
diff changeset
189 }
anatofuz
parents:
diff changeset
190
anatofuz
parents:
diff changeset
191 // rdar://7072507
anatofuz
parents:
diff changeset
192 int test19() {
anatofuz
parents:
diff changeset
193 goto L0; // expected-error {{cannot jump}}
anatofuz
parents:
diff changeset
194
anatofuz
parents:
diff changeset
195 __block int x; // expected-note {{jump bypasses setup of __block variable}}
anatofuz
parents:
diff changeset
196 L0:
anatofuz
parents:
diff changeset
197 x = 0;
anatofuz
parents:
diff changeset
198 ^(){ ++x; }();
anatofuz
parents:
diff changeset
199 return x;
anatofuz
parents:
diff changeset
200 }
anatofuz
parents:
diff changeset
201
anatofuz
parents:
diff changeset
202 // radr://7438948
anatofuz
parents:
diff changeset
203 void test20() {
anatofuz
parents:
diff changeset
204 int n = 7;
anatofuz
parents:
diff changeset
205 int vla[n]; // expected-note {{declared here}}
anatofuz
parents:
diff changeset
206 int (*vm)[n] = 0; // expected-note {{declared here}}
anatofuz
parents:
diff changeset
207 vla[1] = 4341;
anatofuz
parents:
diff changeset
208 ^{
anatofuz
parents:
diff changeset
209 (void)vla[1]; // expected-error {{cannot refer to declaration with a variably modified type inside block}}
anatofuz
parents:
diff changeset
210 (void)(vm+1); // expected-error {{cannot refer to declaration with a variably modified type inside block}}
anatofuz
parents:
diff changeset
211 }();
anatofuz
parents:
diff changeset
212 }
anatofuz
parents:
diff changeset
213
anatofuz
parents:
diff changeset
214 // radr://7438948
anatofuz
parents:
diff changeset
215 void test21() {
anatofuz
parents:
diff changeset
216 int a[7]; // expected-note {{declared here}}
anatofuz
parents:
diff changeset
217 __block int b[10]; // expected-note {{declared here}}
anatofuz
parents:
diff changeset
218 a[1] = 1;
anatofuz
parents:
diff changeset
219 ^{
anatofuz
parents:
diff changeset
220 (void)a[1]; // expected-error {{cannot refer to declaration with an array type inside block}}
anatofuz
parents:
diff changeset
221 (void)b[1]; // expected-error {{cannot refer to declaration with an array type inside block}}
anatofuz
parents:
diff changeset
222 }();
anatofuz
parents:
diff changeset
223 }
anatofuz
parents:
diff changeset
224
anatofuz
parents:
diff changeset
225 // rdar ://8218839
anatofuz
parents:
diff changeset
226 const char * (^func)(void) = ^{ return __func__; };
anatofuz
parents:
diff changeset
227 const char * (^function)(void) = ^{ return __FUNCTION__; };
anatofuz
parents:
diff changeset
228 const char * (^pretty)(void) = ^{ return __PRETTY_FUNCTION__; };